dポイントプレゼントキャンペーン実施中!

SQLでの集計方法がわからず質問をさせていただきます。

改版のたびに商品名を変える商品がたくさんあるとします。
(下記のような感じで、履歴番号が大きいほど新しい)

商品コード 履歴番号 商品名
123456    8    元祖○○
123456    7    ○○外伝ターボ
123456    6    ○○外伝
123456    5    スーパー○○2
123456    4    スーパー○○
123456    3    ○○3
123456    2    ○○2
123456    1    ○○

この場合に、各商品コードの履歴番号が最大(最新)の、
「商品コード」「改版履歴番号」「商品名」を取得するには
どのようなSQLを作成すればいいでしょうか?

A 回答 (5件)

度々です。


#4の回答の複数行出力記述で変えるのは関数名
順位付けの方法が
http://msdn.microsoft.com/ja-jp/library/ms189798 …
このようにありますので
    • good
    • 0

ついでだからRowNumber手法も



select *
from (
select row_number() over (PARTITION BY 商品番号 order by 履歴番号 desc) 順,*
from テーブル)
where 順=1

順ってカラムが先頭に付きます。
今回の場合は履歴番号で必ず1つになりそうですが最大の物が2個になる場合、先の回答では2行出るので
RowNumber関数の場合は PARTITION を変えれば2行出すことも可能だし
色々応用も効くと思いますので
    • good
    • 0

DBは何をお使いですか?


私が今使ってる環境では#2の回答者さまの構文で実行出来ませんでした。
(SQL Server 2005)

なので他の参考として同じ手法で

select I1.*
from テーブル I1
inner join (select 商品番号,
max(履歴番号) 最大番号
from テーブル
group by 商品番号) I2
on I1.商品番号 = I2.商品番号
AND I1.履歴番号 = I2.最大番号

これならAccess、Oracleでも動くかな?
Accessならエイリアスの I1, I2, 最大番号 の前にASをつけないといけないかも。

SQL ServerならRowNumber関数を使って順位を振り1番目だけを取り出す、なんてのが最近の手法かも
http://msdn.microsoft.com/ja-jp/library/ms186734 …
    • good
    • 0

NO1です。



各商品ごとという条件を入れ忘れました。条件入れるとこんな感じです。

select * from テーブル
where (商品番号,履歴番号)
in
(select 商品番号,max(履歴番号)
from テーブル
group by 商品番号)
    • good
    • 0
この回答へのお礼

in()という句を使えばいいんですか!
この用法を知りませんでしたので、大変参考になりました。

さっそく試してみたいと思います。
どうもありがとうございました!

お礼日時:2009/09/16 09:48

select * from テーブル名


where 履歴番号 =
(select max(履歴番号) from テーブル名)
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!