如何在SQL中新增列判断指定ID是否曾获得奖励
解决SQL跨行统计ID是否曾获奖励的问题
原数据表
| ID | YearlyAwardStatus | Year |
|---|---|---|
| 101 | Awarded | 2014 |
| 101 | Not Awarded | 2015 |
| 102 | Not Awarded | 2014 |
| 102 | Not Awarded | 2015 |
预期结果
| ID | YearlyAwardStatus | Year | EverAwarded |
|---|---|---|---|
| 101 | Awarded | 2014 | Yes |
| 101 | Not Awarded | 2015 | Yes |
| 102 | Not Awarded | 2014 | No |
| 102 | Not Awarded | 2015 | No |
单独使用CASE语句只能判断当前行的状态,无法跨行统计同一ID的历史记录,以下两种方法可以实现需求:
方法1:窗口函数(推荐,性能更优)
利用MAX()窗口函数按ID分组,统计该ID是否存在过Awarded状态:
SELECT ID, YearlyAwardStatus, Year, CASE WHEN MAX(CASE WHEN YearlyAwardStatus = 'Awarded' THEN 1 ELSE 0 END) OVER (PARTITION BY ID) = 1 THEN 'Yes' ELSE 'No' END AS EverAwarded FROM your_table_name;
- 内层
CASE将Awarded转换为1,其他状态转换为0 MAX() OVER (PARTITION BY ID)获取每个ID分组内的最大值,若为1则表示该ID曾获奖励
方法2:关联子查询
通过EXISTS子查询检查当前ID是否存在Awarded记录:
SELECT t.ID, t.YearlyAwardStatus, t.Year, CASE WHEN EXISTS (SELECT 1 FROM your_table_name t2 WHERE t2.ID = t.ID AND t2.YearlyAwardStatus = 'Awarded') THEN 'Yes' ELSE 'No' END AS EverAwarded FROM your_table_name t;
EXISTS子查询会快速判断是否存在符合条件的记录,无需遍历全部分组数据
内容的提问来源于stack exchange,提问作者agrhill
相关产品推荐
相关产品推荐

