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

10-117 下位10%のデータを取得

SQLパズル

テーブル
識別ID
------
     2
     4
     6
     8
    10
    12
    14
    16
    18
    20
    22
    24

識別IDの下位10%を出力する(識別IDはユニーク)

テーブルのレコード数が10の倍数でない場合は、
テーブルのレコード数を10で割って、
小数部を切り上げた件数だけ出力する(12件の場合は、2件出力)

出力結果
識別ID
------
     2
     4


SQL

--■■■Row_Number関数を使う方法■■■
select 識別ID
from (select 識別ID,
      Row_Number() over(order by 識別ID) as Rank,
      count(*) over() as RecordCount
        from (select RowNum*2 as 識別ID
                from all_catalog
               where RowNum <=12))
where Rank <= ceil(RecordCount/10);

--■■■NTile関数を使う方法■■■
select 識別ID
from (select 識別ID,
      NTile(10) over(order by 識別ID) as bucket
        from (select RowNum*2 as 識別ID
                from all_catalog
               where RowNum <=12))
where bucket = 1;


解説

NTile関数を使うと、
バケット番号を割り当てることができます。