トップページに戻る
次のSQLパズルへ
前のSQLパズルへ
5-36 in述語の引数に分析関数
SQLパズル
テーブルA(プライマリキーは、Col1,Col2,Col3)
Col1 Col2 Col3
---- ---- ----
1 5 5
1 5 4
1 1 9
2 9 1
2 8 9
2 1 1
3 9 1
3 5 100
3 1 1000
テーブルAから、Col1ごとの、Col2の最大値(複数あったら、Col3が最大のデータ)
を出力する
出力結果
Col1 Col2 Col3
---- ---- ----
1 5 5
2 9 1
3 9 1
データ作成スクリプト
create Table テーブルA(
Col1 number(1),
Col2 number(1),
Col3 number(4),
primary key(Col1,Col2,Col3));
insert into テーブルA values(1,5,5);
insert into テーブルA values(1,5,4);
insert into テーブルA values(1,1,9);
insert into テーブルA values(2,9,1);
insert into テーブルA values(2,8,9);
insert into テーブルA values(2,1,1);
insert into テーブルA values(3,9,1);
insert into テーブルA values(3,5,100);
insert into テーブルA values(3,1,1000);
commit;
SQL
--■■■in述語とRow_Number関数を使う方法■■■
select Col1,Col2,Col3 from テーブルA
where (RowID,1) in
(select b.RowID,
Row_Number() over(partition by b.Col1 order by b.Col2 desc,b.Col3 desc)
from テーブルA b)
order by Col1;
--■■■in述語とFirst_Value関数を使う方法■■■
select Col1,Col2,Col3 from テーブルA
where RowID in
(select First_Value(b.RowID)
over(partition by b.Col1 order by b.Col2 desc,b.Col3 desc)
from テーブルA b)
order by Col1;
--■■■in述語を使わない方法1■■■
select Col1,Col2,Col3 from
(select Col1,Col2,Col3,
Row_Number() over(partition by Col1 order by Col2 desc,Col3 desc) as Rank
from テーブルA)
where Rank=1
order by Col1;
--■■■in述語を使わない方法2■■■
select Col1,max(Col2) as Col2,
max(Col3) keep(Dense_Rank Last order by Col2) as Col3
from テーブルA
group by Col1
order by Col1;
解説
in述語の引数に、分析関数を使ったselect文を使うことができます