ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.3819843 SELECT 文 GROUP での1件目を取得
質問者:cinquecent 非常に初歩的な事で恐縮ですが、
以下のデータを抽出する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の内容を集約しないといけないので困っています。
ご教授いたけないでしょうか?
困り度:
  • すぐに回答を!
質問投稿日時:
08/02/29 11:50
この質問に対する回答は締め切られました。

回答良回答20pt

ANo.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
回答者:chukenkenkou
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/02/29 14:56
この回答へのお礼chukenkenkouさん
アドバイス有難う御座いました。
お返事が遅くなり申し訳ありませんでした。

まさにこれです。
partitionと言う関数があったのですね。
有難う御座いました。

回答

ANo.2 #本題と関係ありませんが・・

いや、「1アイテム目」が「必ず昇順に返ってくる」とか「登録順に返ってくる」とか「物理的な配置順に返ってくる」という保証は、いかなるデータベースでもあり得ません。orderを指定しなければ「順不同(になることもある)」がデータベースです。SQLServerも例外ではありません。
回答者:shimix
種類:アドバイス
どんな人:経験者
自信:参考意見
回答日時:
08/02/29 14:01
この回答へのお礼アドバイスありがとうございます。
もちろん、先頭抽出条件においてはorder等のデータ整列調整は行います。

有難う御座いました。

回答良回答10pt

ANo.1 列2の「1レコード目」というのがどういう意味かわかりませんが(データベースではorderがない状態で1レコード目という概念はあり得ないので)「最小のもの」でよければ

 select 列1, min(列2) as 列2_min from テーブル group by 列1

でいいと思います。
回答者:shimix
種類:アドバイス
どんな人:経験者
自信:参考意見
回答日時:
08/02/29 12:08
この回答へのお礼shimixさん
回答ありがとうございました。

1レコード目と言うのはおかしな表現でした。
失礼致しました。
1アイテム目と言う事で有ってますでしょうか。

>select 列1, min(列2) as 列2_min from テーブル group by 列1
なるほど、値を大小区別できるように抽出しておいてやれば、取得出来ますね。また、別の列にROW_NUMBERを切ってやれば大小関係なく抽出できそうです。
有難う御座いました。