• 締切済み

SQLでの集計方法について

SQLでの集計方法がわからず質問をさせていただきます。 改版のたびに商品名を変える商品がたくさんあるとします。 (下記のような感じで、履歴番号が大きいほど新しい) 商品コード 履歴番号 商品名 123456    8    元祖○○ 123456    7    ○○外伝ターボ 123456    6    ○○外伝 123456    5    スーパー○○2 123456    4    スーパー○○ 123456    3    ○○3 123456    2    ○○2 123456    1    ○○ この場合に、各商品コードの履歴番号が最大(最新)の、 「商品コード」「改版履歴番号」「商品名」を取得するには どのようなSQLを作成すればいいでしょうか?

みんなの回答

  • noah7150
  • ベストアンサー率46% (116/251)
回答No.5

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

  • noah7150
  • ベストアンサー率46% (116/251)
回答No.4

ついでだからRowNumber手法も select * from ( select row_number() over (PARTITION BY 商品番号 order by 履歴番号 desc) 順,* from テーブル) where 順=1 順ってカラムが先頭に付きます。 今回の場合は履歴番号で必ず1つになりそうですが最大の物が2個になる場合、先の回答では2行出るので RowNumber関数の場合は PARTITION を変えれば2行出すことも可能だし 色々応用も効くと思いますので

  • noah7150
  • ベストアンサー率46% (116/251)
回答No.3

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.aspx

  • tostem41
  • ベストアンサー率38% (7/18)
回答No.2

NO1です。 各商品ごとという条件を入れ忘れました。条件入れるとこんな感じです。 select * from テーブル where (商品番号,履歴番号) in (select 商品番号,max(履歴番号) from テーブル group by 商品番号)

kovayashi
質問者

お礼

in()という句を使えばいいんですか! この用法を知りませんでしたので、大変参考になりました。 さっそく試してみたいと思います。 どうもありがとうございました!

  • tostem41
  • ベストアンサー率38% (7/18)
回答No.1

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