|
スポンサード リンク
グループ単位に、ソートしたレコードの先頭行に集計関数を使用するには、FIRST関数を使用する。
分析関数のFIRSTは、ウィンドウ(window)を操作してレコードの先頭行に集計関数を使用します。
集計関数() KEEP
( DENSE_RANK FIRST ORDER BY ソート列1,[ソート列2,・・・] )
OVER( [ PARTITION BY 項目1,[項目2,・・・]] ) |
ソート列でソートされたレコードの先頭行を、指定した集計関数で集計した結果が返されます。
指定可能な集計関数 : AVG()、COUNT()、MAX()、MIN()、SUM()、STDDEV()、VARIANCE()
OVER()は、PERCENT_RANK関数と一緒に使用します
PRTITION BY句には、グループ化対象項目を指定する
ORDERY BY句には、ソート対象の項目を指定する |
サンプル表「emp01」データ
|
SQL> select * from emp01;
EMP_ID DEPT_ID EMP_NAME YEARS SALARY
----- ----- ---------- ---------- ----------
E01 D01 なまえ1 3 150
E02 D02 なまえ2 7 200
E03 D03 なまえ3 7 300
E04 D02 なまえ4 7 400
E05 D03 なまえ5 3 500
E06 D02 なまえ6 3 600 |
例1) 列「years」の昇順でソートしたレコードの先頭行で、「salary」の最大値を取得します。
|
SQL> select
2 emp_id, years, salary,
3 max( salary ) keep ( dense_rank first order by years )
4 over() as max
5 from emp01;
EMP_ID YEARS SALARY MAX
----- ----- ------- ----------
E01 3 150 600
E02 7 200 600
E03 7 300 600
E04 7 400 600
E05 3 500 600
E06 3 600 600
|
※列「years」の昇順にソートしたレコードの先頭行なので「years」=3のレコードの中での、最大値を取得するので600となります。
例2) 列「dept_id」別に、列「years」の昇順でソートしたレコードの先頭行で、「salary」の最大値をそれぞれ取得します。
|
SQL> select
2 emp_id,dept_id,years,salary,
3 max( salary ) keep (dense_rank first order by years)
4 over( partition by dept_id ) as max
5 from emp01;
EMP_ID DEPT_ID YEARS SALARY MAX
----- ----- ----- ------- ----------
E01 D01 3 150 150
E02 D02 7 200 600
E06 D02 3 600 600
E04 D02 7 400 600
E05 D03 3 500 500
E03 D03 7 300 500 |
スポンサード リンク
|