如何按ID分组仅返回一行数据,优先保留Approved状态记录?
按ID分组筛选记录的实现方案
原始数据
| ID | NAME | DATE | STATUS |
|---|---|---|---|
| 1 | Joe | 01-22 | Approved |
| 1 | Joe | 01-22 | Pending |
| 2 | Bill | 02-22 | Approved |
| 2 | Bill | 02-22 | Sent back |
| 3 | John | 01-22 | Approved |
| 4 | Bob | 02-22 | Pending |
筛选规则
- 同一ID同时存在
Approved和Pending状态时,仅保留Approved记录 - 若ID仅有一条记录,直接保留该记录
- 优先保留
Approved状态的记录
最终筛选结果
| ID | NAME | DATE | STATUS |
|---|---|---|---|
| 1 | Joe | 01-22 | Approved |
| 2 | Bill | 02-22 | Approved |
| 3 | John | 01-22 | Approved |
| 4 | Bob | 02-22 | Pending |
实现代码(SQL)
用窗口函数给每条记录按状态优先级排序,再取每个ID的第一条记录即可:
WITH ranked_records AS ( SELECT ID, NAME, DATE, STATUS, ROW_NUMBER() OVER ( PARTITION BY ID ORDER BY CASE STATUS WHEN 'Approved' THEN 1 ELSE 2 END ) AS rn FROM your_table_name ) SELECT ID, NAME, DATE, STATUS FROM ranked_records WHERE rn = 1;
代码逻辑说明
PARTITION BY ID:按ID分组处理ORDER BY CASE STATUS WHEN 'Approved' THEN 1 ELSE 2 END:给Approved状态赋予最高优先级(排序值1),其他状态为2- 每个ID只取排序为1的记录,完美匹配需求中的优先级规则
内容的提问来源于stack exchange,提问作者toweliey
相关产品推荐
相关产品推荐

