You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 21:36:04