# 使用 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)