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

10-3 RowNum指定によるCountStop

SQLパズル

Googleテーブルの重要度の順位が900以上920以下のデータを重要度の降順に表示する。
Googleテーブルのプライマリキーは重要度とする。
Googleテーブルには、1万件のデータがある。

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


データ作成スクリプト

create table Googleテーブル(
重要度 number(5),
紹介文 char(11),
primary key(重要度));

begin
    for i in 1..10000 loop
        insert into Googleテーブル values(i,'紹介文' || to_char(i));
    end loop;
    commit;
end;
/


SQL

--■■■相関サブクエリを使う方法■■■
select 重要度,紹介文
from Googleテーブル a
where (select count(b.重要度)+1 from Googleテーブル b
        where b.重要度 > a.重要度
          and RowNum <= 920) between 900 and 920
  and RowNum <= (920-900)+1
order by 重要度 desc;

--■■■インラインビューでソートする方法■■■
select 重要度,紹介文 from(
    select 重要度,紹介文,RowNum as Rank from(
        select 重要度,紹介文 from Googleテーブル order by 重要度 desc))
where Rank between 900 and 920
  and RowNum <= (920-900)+1
order by 重要度 desc;

--■■■分析関数を使う方法■■■
select 重要度,紹介文 from(
    select 重要度,紹介文,Row_Number() over(order by 重要度 desc) as Rank
      from Googleテーブル)
where Rank between 900 and 920
  and RowNum <= (920-900)+1
order by 重要度 desc;


解説

相関サブクエリを使う方法では、
サブクエリのwhere句でのRowNum <= 920 によって、
921位以降は正確な順位を求めない(全て921位とみなす)ようになってます。

全ての方法で、外側のクエリでのRowNum <= (920-900)+1 によって、
21件のデータを取得したら処理を打ち切って、パフォーマンスを向上させてます。

where句でのRowNum <= (920-900)+1は、植木算の考え方を使ってます。

RowNum指定によるCountStop

算数道場 8・文章題 2・植木算_その1
植木算
「植木算」で何を学ぶのか?
植木算の公式