Redshift/Postgres SQL如何将区间年份字段拆分为多行单年份数据
解决方案
Redshift 不支持在表查询场景中直接使用 generate_series 函数,可通过连续年份辅助表+字段拆分关联的方式实现需求,具体步骤如下:
1. 构造连续年份辅助表
首先构造一张包含你业务中所有可能涉及年份的临时表,年份范围可根据实际数据调整,推荐使用递归CTE快速生成:
CREATE TEMP TABLE years AS WITH RECURSIVE cte_years AS ( SELECT 1990 AS y -- 替换为你的数据中最小的年份 UNION ALL SELECT y + 1 FROM cte_years WHERE y < 2050 -- 替换为你的数据中最大的年份 ) SELECT y FROM cte_years;
如果你的Redshift版本不支持递归CTE,也可以手动插入数据构造:
CREATE TEMP TABLE years (y INT); -- 补全所有需要的年份即可 INSERT INTO years VALUES (1990),(1991),(1992),...,(2050);
2. 拆分区间并关联年份表
通过 split_part 函数拆分出每个行的年份区间上下限,再和年份辅助表做范围关联,即可得到拆分后的单年份行:
SELECT a.color, y.y::VARCHAR AS year FROM TableA a -- 拆分年份区间的起止值 LEFT JOIN LATERAL ( SELECT CAST(split_part(a.year, '-', 1) AS INTEGER) AS start_y, CASE WHEN split_part(a.year, '-', 2) = '' THEN CAST(split_part(a.year, '-', 1) AS INTEGER) ELSE CAST(split_part(a.year, '-', 2) AS INTEGER) END AS end_y ) yr ON TRUE -- 匹配区间内所有年份 JOIN years y ON y.y BETWEEN yr.start_y AND yr.end_y -- 可选:增加格式校验避免类型转换报错 WHERE a.year ~ '^[0-9]+(-[0-9]+)?$' ORDER BY a.color, y.y;
效果验证
对原数据中color=blue、year=2003-2006的行,关联后会自动匹配2003、2004、2005、2006四个年份,直接输出你需要的拆分结果;单年份的行只会匹配到自身年份,不会产生额外冗余行。
内容的提问来源于stack exchange,提问作者ShaneOH
相关产品推荐
相关产品推荐

