質問 |
||
| 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を切ってやれば大小関係なく抽出できそうです。 有難う御座いました。 |