如何将单列非空日期转换为双列起止日期?尝试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
相关产品推荐
相关产品推荐

