Try   HackMD

使用 row_number() 來實現群組編排序號

tags: Oracle
  1. 假設有一張資料表(pay_table)如下:

    pay_date tic_no money cnt
    2019-05-15 T300104 $46,440 11
    2019-05-15 I300132 $573 1
    2019-05-15 I300129/T400265 $107,196 39
    2019-05-17 I300128 $10,929 2
  2. 若要依pay_date欄位做分組序號,可以用ROW_NUMBER() OVER(PARTITION BY 群組依據欄位 ORDER BY 排序依據欄位 DESC)來實現

    ​​​​SELECT (ROW_NUMBER() OVER(PARTITION BY pay_date ORDER BY tic_no DESC)) group_sn, pay_date, tic_no, money, cnt
    ​​​​FROM pay_table
    
  3. 成果如下:

    group_sn pay_date tic_no money cnt
    1 2019-05-15 T300104 $46,440 11
    2 2019-05-15 I300132 $573 1
    3 2019-05-15 I300129/T400265 $107,196 39
    1 2019-05-17 I300128 $10,929 2
  4. 應用情境:資料分組後取前三筆資料 [參照]

    • 假設有以下資料表(表名為temp_table)

      商品 品牌 業績
      NIKE 1234000
      愛迪達 132200
      雜牌 223400
      PUMA 43532
      手機 HTC 32423
      手機 IPHONE 423
      手機 三星 23413
      手機 NOKIA 14344
    • 解法

      ​​​​​​​​select 商品,品牌,業績,排名 from (
      ​​​​​​​​    select  T100.*
      ​​​​​​​​        ,row_number() over (partition by 商品 order by 業績 desc  ) 排名
      ​​​​​​​​    from temp_table T100
      ​​​​​​​​)where 排名 <= 3;
      
    • 結果資料集

      商品 品牌 業績 排名
      手機 HTC 32423 1
      手機 三星 23413 2
      手機 NOKIA 14344 3
      NIKE 1234000 1
      雜牌 223400 2
      愛迪達 132200 3
  5. 參考資料: