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

如何将单列非空日期转换为双列起止日期?尝试Pivot未获预期结果

解决方案:将单列非空日期两两配对为起止日期列

思路

先过滤空值,给非空日期按原顺序分配连续序号,再通过序号分组或窗口函数,把奇数位日期作为起始日期、偶数位作为结束日期,实现两两配对。

方法一:分组聚合(通用SQL)

WITH filtered_dates AS (
    -- 筛选非空日期,按原行号排序并分配连续序号
    SELECT 
        old_date_row,
        ROW_NUMBER() OVER (ORDER BY rn) AS seq
    FROM your_table
    WHERE old_date_row IS NOT NULL
),
grouped_dates AS (
    -- 每两个日期分为一组
    SELECT 
        old_date_row,
        seq,
        FLOOR((seq - 1)/2) AS grp
    FROM filtered_dates
)
-- 聚合得到每组的起止日期
SELECT 
    MAX(CASE WHEN seq % 2 = 1 THEN old_date_row END) AS start_date,
    MAX(CASE WHEN seq % 2 = 0 THEN old_date_row END) AS end_date
FROM grouped_dates
GROUP BY grp
ORDER BY grp;

方法二:LEAD窗口函数(更简洁)

WITH filtered_dates AS (
    SELECT 
        old_date_row,
        ROW_NUMBER() OVER (ORDER BY rn) AS seq
    FROM your_table
    WHERE old_date_row IS NOT NULL
)
SELECT 
    old_date_row AS start_date,
    LEAD(old_date_row) OVER (ORDER BY seq) AS end_date
FROM filtered_dates
WHERE seq % 2 = 1; -- 仅保留奇数序号行,对应取后续偶数序号行作为结束日期

说明

  • 你之前尝试的PIVOT不适用此场景:PIVOT主要用于将行值转换为列名,而这里是按顺序对行进行两两分组配对,属于行的重组,因此窗口函数+分组/LEAD函数更合适。
  • 上述代码适配Oracle语法(对应日期格式DD-MON-RR),其他数据库可微调语法(如PostgreSQL用(seq-1)/2::INTEGER替代FLOOR((seq-1)/2),SQL Server用FLOOR((seq-1)/2.0))。

内容的提问来源于stack exchange,提问作者Bob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 15:25:07