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

6-3 項目別のTOP3を取得

SQLパズル

Tテーブル
Name  Value  ID
----  -----  --
   A     10   1
   A     20   2
   A     30   3
   A     40   4
   A     50   5
   B    100   6
   B    200   7
   B    300   8
   B    400   9

Name別の、ValueのTOP3を求める。

出力結果
Name  Value  ID  Rank
----  -----  --  ----
   A     10   1     1
   A     20   2     2
   A     30   3     3
   B    100   6     1
   B    200   7     2
   B    300   8     3


データ作成スクリプト

create table T(
Name  char(1),
Value number(3),
ID    number(1),
primary key(ID));

insert into T values ('A', 10,1);
insert into T values ('A', 20,2);
insert into T values ('A', 30,3);
insert into T values ('A', 40,4);
insert into T values ('A', 50,5);
insert into T values ('B',100,6);
insert into T values ('B',200,7);
insert into T values ('B',300,8);
insert into T values ('B',400,9);
commit;


SQL

--■■■相関サブクエリを使う方法■■■
select Name,Value,ID,
(select count(b.ID)+1 from T b
        where b.name=a.name
          and b.Value < a.Value) as Rank
from T a
where (select count(b.ID)+1 from T b
        where b.name=a.name
          and b.Value < a.Value) <=3
order by ID;

--■■■相関サブクエリとインラインビューを使う方法■■■
select Name,Value,ID,rank
from (select Name,Value,ID,
             (select count(b.ID)+1 from T b
               where b.name=a.name
                 and b.Value < a.Value) as Rank
        from T a)
where Rank <=3
order by ID;

--■■■分析関数を使用する方法■■■
select Name,Value,ID,Rank from
    (select Name,Value,ID,
     Rank() over (partition by Name order by Value) as Rank
     from T)
where Rank <=3
order by ID;


解説

相関サブクエリを使う方法では、
同じnameで、Valueが小さいレコードの数を、
相関サブクエリで取得して、順位を取得してます。