# 使用 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)`來實現 ```SQL 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. 應用情境:資料分組後取前三筆資料 [[參照](https://ithelp.ithome.com.tw/questions/10188648)] * 假設有以下資料表(表名為temp_table) |商品 |品牌 |業績 | |------|----|----:| |鞋|NIKE|1234000 | |鞋|愛迪達|132200 | |鞋|雜牌|223400 | |鞋|PUMA|43532 | |手機|HTC|32423| |手機|IPHONE|423| |手機|三星|23413| |手機|NOKIA|14344| * 解法 ```SQL 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. 參考資料: * [SQL排序函式 ROWNUM / ROW_NUMBER / RANK / DENSE_RANK](https://dotblogs.com.tw/jimbo/2018/05/02/095322) * [ROW_NUMBER Analytic Function @ ORACLE-BASE](https://oracle-base.com/articles/misc/row_number-analytic-function)