基于年份列生成自定义列的CASE表达式重叠数据处理需求
解决Year列生成多分类自定义列的重叠问题
需求是基于year列生成自定义分类列,初始的CASE逻辑如下:
year <= '2017' THEN 'Old Cars' year BETWEEN '2018' AND '2023' THEN 'New Cars' year = '2023' THEN 'Current Year Cars'
但这里2023年同时属于两个分类,常规CASE语句只能返回第一个匹配的结果,无法实现同一年份对应多个分类的效果。要得到如下预期输出:
2015 - Old Cars 2016 - Old Cars 2017 - Old Cars 2018 - New Cars 2019 - New Cars 2020 - New Cars 2021 - New Cars 2022 - New Cars 2023 - New Cars 2023 - Current Year Cars
可以用UNION ALL拆分三个逻辑分支来实现,这样同一行数据可以生成多条分类记录:
-- 假设表名为cars,year为目标列 SELECT year, 'Old Cars' AS car_category FROM cars WHERE year <= '2017' UNION ALL SELECT year, 'New Cars' AS car_category FROM cars WHERE year BETWEEN '2018' AND '2023' UNION ALL SELECT year, 'Current Year Cars' AS car_category FROM cars WHERE year = '2023' -- 按年份和分类排序,确保输出顺序符合预期 ORDER BY year, car_category;
原理说明
常规CASE语句在每一行只能返回一个分类值,而UNION ALL可以将三个独立查询的结果合并:
- 第一个查询筛选2017及更早的年份,标记为'Old Cars'
- 第二个查询筛选2018-2023的年份,标记为'New Cars'
- 第三个查询单独筛选2023年,标记为'Current Year Cars'
这样2023年就会在结果中出现两次,分别对应两个分类,完全匹配预期输出。
内容的提问来源于stack exchange,提问作者Raunak
相关产品推荐
相关产品推荐

