1. ホーム
  2. データベース

DB2におけるROW_NUMBER() OVER()関数の使用法

2022-03-02 16:17:04

1、row_number()over()ソート関数。

(1) row_number() over() グループソート機能。

     row_number() over() 関数を使用した場合、over() におけるグループ化およびソートは、 where group by order by の実行より後に行われます。

partition byは結果集合のグループ化に使用され、指定しない場合は結果集合全体をグループとして扱います。集約関数との違いは、集約関数が一般的に統計情報を反映した1行のみを返すのに対し、グループ内で複数行を返すことができる点である。

例:従業員、部門別グループ分けでソート。

  1. セレクト <スパン  empno,WORKDEPT,SALARY, Row_Number() OVER (partition)  <スパン で <スパン  ワークデプト  オーダー バイ  給与  降下 ) ランク  フロム  従業員   
  2. -------------------------------------- <スパン
  3. 000010 a00 152750 1  
  4. 000110 a00 66500 2  
  5. 000120 a00 49250 3  
  6. 200010 a00 46500 4  
  7. 200120 a00 39250 5  
  8. 000020 b01 94250 1  
  9. 000030 c01 98250 1  
  10. 000130 c01 73800 2  




(2) クエリ結果をソートする。(グループ化なし)

  1. セレクト <スパン  empno,WORKDEPT,SALARY, Row_Number() OVER (

    <スパン ORDER
    バイ  給与  降下 ) ランク  フロム  従業員   
  2. -------------------------------------- <スパン
  3. 000010 a00 152750 1  
  4. 000030 c01 98250 2  
  5. 000070 d21 96170 3  
  6. 000020 b01 94250 4  
  7. 000090 e11 89750 5  
  8. 000100 e21 86150 6  
  9. 000050 e01 80175 7  
  10. 000130 c01 73800 8  
  11. 000060 d11 72250 9  




     row_number() over() は rownum に似ていますが、もう少し強力です (各グループ内で 1 からソートできます)。





2. rank() over() はジャンプソートで、2位が2つあるとき、次は4位(これも各グループ内)です。

  1. セレクト <スパン  勤務先,給与,ランク() over(partition)  <スパン で <スパン  ワークデプト  注文 によって <スパン  給与)  として  密なランク順  から  エンプ  注文 によって  ワークデプト  
  2. ------------------
  3. <スパン A00 39250 1  
  4. <スパン A00 46500 2  
  5. <スパン A00 49250 3  
  6. <スパン A00 66500 4  
  7. <スパン A00 152750 5  
  8. b01 94250 1  
  9. c01 68420 1  
  10. <スパン C01 68420 1  
  11. C01 73800 3  








3. dense_rank() over() は連続ソートで、2位がまだ2つ続いています。これに対してrow_numberは重複する値がない ? .



  1. セレクト <スパン  勤務先,給与,dense_rank() over(partition)  <スパン で <スパン  ワークデプト  注文 によって <スパン  給与)  として  密なランク順  から  エンプ  注文 によって  ワークデプト  
  2. ------------------
  3. <スパン A00 39250 1  
  4. <スパン A00 46500 2  
  5. <スパン A00 49250 3  
  6. <スパン A00 66500 4  
  7. <スパン A00 152750 5  
  8. b01 94250 1  
  9. c01 68420 1  
  10. <スパン C01 68420 1  
  11. C01 73800 2  
  12. C01 98250 3  








---ROW_NUMBERを使用して重複データを削除します。 



---テーブルTABにa,b,cの3つの列があるとします。次のステートメントを使用して、a,b,c がすべて同じである重複行を削除することができます。







  1. DELETE フロム  ( セレクト <スパン ,QUARTER,RESULTS,行数() over(partition)  <スパン 年 <スパン 四半期業績  注文 <スパン によって <スパン 年 <スパン ,四半期,結果)  <スパン AS <スパン  ROW_NO 

    フロム  セール )   
  2. <スパン 以下はその例です。  ROW_NO>1