以下のようなテーブルがあります。
aaa,str1
aaa,str2
bbb,str3
ccc,str4
ccc,str5
ccc,stt6
ddd,str7
のように第1項には、ユニークではない、かつ何種類あるか分からない(重複を除いた場合何件のレコードがあるか分からない)の文字列が入っています。第1項すべてのパターンに対して上から最大2件データを取得したいのですがどのようなSQL文を書けばよいでしょうか。
上記のテーブルに対して求める結果は
aaa,str1
aaa,str2
bbb,str3
ccc,str4
ccc,str5
ddd,str7
となります。
また、以下のテーブルがあったら
aaa,str1
aaa,str2
aaa,str3
ttt,str4
ttt,str5
rrr,str6
rrr,str7
rrr,str8
求める結果は
aaa,str1
aaa,str2
ttt,str4
ttt,str5
rrr,str6
rrr,str7
となります。
よろしくお願いします。
明示されていなかったので、テーブル名を "test"、第1項を "ID"、第2項を "VAL" にしています。
適宜置き換えてください。
まず回答から。
select t.ID, t.VAL from (select (case when @p <> ID then (@c := 0) end) c, (@c := @c + 1) no, (@p := ID) pr, ID, VAL from test order by ID ) t where t.no < 3;
以下、(簡単にですが)解説です。
まず以下の部分で
select (case when @p <> ID then (@c := 0) end) c, (@c := @c + 1) no, (@p := ID) pr, ID, VAL from test order by ID
ID が同じものの間で連番が振られるようにしてます。
そこから、連番が 3 より小さいものをとれば最大二つずつ取れる仕組みです。
1、先ず、先頭フールドでユニーク化して第二フールドの先頭レコードの抽出。
2、元のテーブルから1結果のテーブルのデータ以外を抽出し、その結果の先頭レコードを抽出。
3、ユニオンクエリで1,2を連結し、ソートする。
コメント(0件)