如何为每个id标记数据表中的首行与末行
问题描述
我有如下数据表:
| id | RANK |
|---|---|
| 111 | 1 |
| 111 | 2 |
| 111 | 3 |
| 222 | 1 |
| 222 | 2 |
希望添加两列first和last,标记该行是否为对应id的首行/末行,期望结果如下:
| id | first | last |
|---|---|---|
| 111 | YES | NO |
| 111 | NO | NO |
| 111 | NO | YES |
| 222 | YES | NO |
| 222 | NO | YES |
解决方案
可以用SQL窗口函数实现,通过分组内的行号和总行数判断首末行:
SELECT id, CASE WHEN ROW_NUMBER() OVER(PARTITION BY id ORDER BY RANK) = 1 THEN 'YES' ELSE 'NO' END AS first, CASE WHEN ROW_NUMBER() OVER(PARTITION BY id ORDER BY RANK DESC) = 1 THEN 'YES' ELSE 'NO' END AS last FROM your_table_name ORDER BY id, RANK;
逻辑说明:
PARTITION BY id:按id拆分数据组,单独处理每个id下的行ROW_NUMBER() OVER(...):在分组内按RANK正序生成行号,行号为1的就是首行;按RANK倒序生成行号,行号为1的就是末行CASE语句将判断结果转为YES/NO标记
内容的提问来源于stack exchange,提问作者Bar Fichman
相关产品推荐
相关产品推荐

