gooドクター有料プランが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の内容を集約しないといけないので困っています。
ご教授いたけないでしょうか?

gooドクター

A 回答 (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
    • good
    • 12
この回答へのお礼

chukenkenkouさん
アドバイス有難う御座いました。
お返事が遅くなり申し訳ありませんでした。

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

お礼日時:2008/02/29 20:16

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



いや、「1アイテム目」が「必ず昇順に返ってくる」とか「登録順に返ってくる」とか「物理的な配置順に返ってくる」という保証は、いかなるデータベースでもあり得ません。orderを指定しなければ「順不同(になることもある)」がデータベースです。SQLServerも例外ではありません。
    • good
    • 2
この回答へのお礼

アドバイスありがとうございます。
もちろん、先頭抽出条件においてはorder等のデータ整列調整は行います。

有難う御座いました。

お礼日時:2008/02/29 14:36

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



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

でいいと思います。
    • good
    • 0
この回答へのお礼

shimixさん
回答ありがとうございました。

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

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

お礼日時:2008/02/29 13:06

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

このQ&Aを見た人はこんなQ&Aも見ています

gooドクター

関連するカテゴリからQ&Aを探す


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング