- ベストアンサー
SELECT 文 GROUP での1件目を取得
非常に初歩的な事で恐縮ですが、 以下のデータを抽出するsql文の書き方を模索しています。 環境:SQLSERVER2005 | 列1| 列2 | +---+---+ | 1 | A | | 1 | B | | 1 | C | | 1 | D | | 2 | F | | 2 | G | | 2 | H | | 3 | X | | 3 | Y | | 3 | Z | 上記のテーブルがあるとします。 列1でグループした値で、1レコード目の列2を抽出したいのです。 出力結果としては、 列1列2 +--+--+ 1,A 2,F C,X としたいのです。 列1でGROUPしてしまうと列2の内容を集約しないといけないので困っています。 ご教授いたけないでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
SQL Server 2005では、Oracleでいう分析関数が実装されています。 select 列名1, 列名2 from (select rank() over(partition by 列1 order by 列2) as rk, 列1,列2 from 表名) as x where rk=1
その他の回答 (2)
- shimix
- ベストアンサー率54% (865/1590)
#本題と関係ありませんが・・ いや、「1アイテム目」が「必ず昇順に返ってくる」とか「登録順に返ってくる」とか「物理的な配置順に返ってくる」という保証は、いかなるデータベースでもあり得ません。orderを指定しなければ「順不同(になることもある)」がデータベースです。SQLServerも例外ではありません。
お礼
アドバイスありがとうございます。 もちろん、先頭抽出条件においてはorder等のデータ整列調整は行います。 有難う御座いました。
- shimix
- ベストアンサー率54% (865/1590)
列2の「1レコード目」というのがどういう意味かわかりませんが(データベースではorderがない状態で1レコード目という概念はあり得ないので)「最小のもの」でよければ select 列1, min(列2) as 列2_min from テーブル group by 列1 でいいと思います。
お礼
shimixさん 回答ありがとうございました。 1レコード目と言うのはおかしな表現でした。 失礼致しました。 1アイテム目と言う事で有ってますでしょうか。 >select 列1, min(列2) as 列2_min from テーブル group by 列1 なるほど、値を大小区別できるように抽出しておいてやれば、取得出来ますね。また、別の列にROW_NUMBERを切ってやれば大小関係なく抽出できそうです。 有難う御座いました。
お礼
chukenkenkouさん アドバイス有難う御座いました。 お返事が遅くなり申し訳ありませんでした。 まさにこれです。 partitionと言う関数があったのですね。 有難う御座いました。