如何在Pivot操作中消除重复值并将重复项置为0.0
解决Pivot时重复值二次及以后设为0.0的问题
首先,我们需要明确核心需求:当同一个RainDays值多次出现时,仅保留第一次出现的原值,后续重复出现的都替换为0.0,再进行Pivot操作将年份转为列。
原数据回顾
Pivoting前的数据:
| Year | RainDays |
|---|---|
| 2012 | 112 |
| 2013 | 116 |
| 2014 | 111 |
| 2015 | 80 |
| 2016 | 110 |
| 2017 | 102 |
| 2018 | 80 |
| 2019 | 110 |
预期结果
| 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 | 2019 |
|---|---|---|---|---|---|---|---|
| 112 | 116 | 111 | 80 | 110 | 102 | 0.0 | 0.0 |
解决方案SQL
我们需要先对重复的RainDays进行标记和替换,再执行Pivot:
SELECT [2012], [2013], [2014], [2015], [2016], [2017], [2018], [2019] FROM ( SELECT Year, -- 标记每个RainDays的出现次数,第一次保留原值,后续设为0.0 CASE WHEN ROW_NUMBER() OVER(PARTITION BY RainDays ORDER BY Year ASC) = 1 THEN RainDays ELSE 0.0 END AS ProcessedRainDays FROM Rain ) AS SourceTable PIVOT ( -- 因为每个年份唯一,用Max或Min都可以 MAX(ProcessedRainDays) FOR Year IN ([2012], [2013], [2014], [2015], [2016], [2017], [2018], [2019]) ) AS PivotTable
代码解释
- 标记重复值:在子查询中,使用
ROW_NUMBER() OVER(PARTITION BY RainDays ORDER BY Year ASC)对每个RainDays值按年份排序,生成组内序号。当序号为1时,保留原始RainDays;否则替换为0.0。 - Pivot转换:将处理后的结果按Year进行Pivot,把年份转为列,提取每个年份对应的
ProcessedRainDays值(因为每个年份唯一,MAX/Min函数都能正确取到对应值)。
这样就能完美实现你需要的重复值处理逻辑啦!
内容的提问来源于stack exchange,提问作者rock
相关产品推荐
相关产品推荐

