分析関数 OVER (PARTITION BY ~ ORDER BY ~)
グループ毎の件数
select 社員マスタ.* ,count(*) over( partition by 課コード) as 課人数 from 社員マスタ
課コード毎の人数も出力する
グループ毎の最大値
select 社員マスタ.* ,max(年齢) over( partition by 課コード) as 課高齢 from 社員マスタ
課コード毎の最高年齢も出力する
グループ毎の合計数
select 社員マスタ.* ,sum(基本給) over( partition by 課コード) as 課基本給 from 社員マスタ
課コード毎の基本給合計も出力する
グループ毎のランク
select 社員マスタ.* ,rank() over( partition by 課コード order by 基本給 desc) as 課基本給ランク from 社員マスタ
課コード毎の基本給高額順位も出力する
基本給が同額の人がいた場合、rank関数は、1,1,3 と返す。
同種の関数で dense_rank 関数は 1,1,2 と返す
グループ毎の行番号
select 社員マスタ.* ,row_number() over( partition by 課コード order by 基本給 desc) as 課基本給ランク from 社員マスタ
課コード毎の基本給高額順位も出力する
基本給が同額の人がいた場合でも、row_number関数は、1,2,3 と、一意の順番を返す。
n行前の参照
n行前が存在しない場合は、nullを返却する
select 社員マスタ.* ,lag(基本給) over( order by 基本給) as 次基本給額 from 社員マスタ
自分の次に高い基本給も出力する(基本給順にならべて、自分の前のレコード)
select 社員マスタ.* ,lag(基本給,2) over( order by 基本給) as 次基本給額 from 社員マスタ
自分の次の次に高い基本給も出力する(基本給順にならべて、自分の2つ前のレコード)
select 社員マスタ.* ,lag(基本給) over(partition by 課コード order by 基本給) as 課内次基本給額 from 社員マスタ
自分課内で、次に高い基本給も出力する(課内で基本給順にならべて、自分の前のレコード)
n行後の参照
select 社員マスタ.* ,lead(基本給) over( order by 基本給 ) as 次基本給額 from 社員マスタ
グループの先頭/末尾
LAST_VALUE( 項目 [ IGNORE NULLS ] ) IGNORE NULLS を付けると、nullでない先頭/末尾の項目を取得する
select 社員マスタ.* ,first_value(社員コード) over(partition by 課コード order by 基本給 ) as 課低基本給額社員 from 社員マスタ
select 社員マスタ.* ,last_value(社員コード) over(partition by 課コード order by 基本給 ) as 課高基本給額社員 from 社員マスタ