トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

10-242 having句でLast関数

SQLパズル

IDTable
ID  Val  Seq
--  ---  ---
 1    6    1
 1  -70    2
 1  -40    3
 1    6    4
 2   12    1
 2   -1    2
 5    8    1
 6    3    2
 7   -8    1
 7   99    2
 8    7    1
 8   -7    2

IDごとで、Seqが最大の行のValが負なら出力する。

出力結果
ID
--
 2
 8

こちらを参考にさせていただきました(英語)


データ作成スクリプト

create table IDTable(ID,Val,Seq) as
select 1,  6,1 from dual union
select 1,-70,2 from dual union
select 1,-40,3 from dual union
select 1,  6,4 from dual union
select 2, 12,1 from dual union
select 2, -1,2 from dual union
select 5,  8,1 from dual union
select 6,  3,2 from dual union
select 7, -8,1 from dual union
select 7, 99,2 from dual union
select 8,  7,1 from dual union
select 8, -7,2 from dual;


SQL

select ID
  from IDTable
group by ID
having max(Val) Keep (Dense_Rank Last order by Seq) < 0;


解説

Keep句のorder by句で、
ソートキーによって一意になるようにすると
分かりやすいと思いますね。