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

如何获取数据表中行的交集?以多日期列数据表为例

多行数据合并为单行(取字段非空值)

针对你给出的示例数据,要合并相同CODE的多行记录,取每个字段的非空值(即保留所有行中该字段出现过的有效数据),可以通过SQL聚合函数快速实现,以下是具体方案:

核心方法:使用MAX()聚合函数(适配MySQL、SQL Server等主流数据库)

NULL在聚合函数计算时会被自动忽略,对每个日期字段取最大值,就能得到该字段在所有行中的非空值:

SELECT 
    CODE,
    MAX(STATE_DATE1) AS STATE_DATE1,
    MAX(STATE_DATE2) AS STATE_DATE2,
    MAX(STATE_DATE3) AS STATE_DATE3,
    MAX(STATE_DATE4) AS STATE_DATE4
FROM 
    your_table_name
GROUP BY 
    CODE;

验证效果

原数据表:

CODE           STATE_DATE1   STATE_DATE2  STATE_DATE3  STATE_DATE4
100_B           2023-04-10    2023-04-11   NULL         NULL
100_B           2023-04-10    2023-04-11   NULL         2023-04-12
100_B           2023-04-10    2023-04-11   2023-04-12   NULL

执行上述SQL后,得到期望结果:

CODE      STATE_DATE1   STATE_DATE2  STATE_DATE3  STATE_DATE4
100_B      2023-04-10    2023-04-11   2023-04-12   2023-04-12

备选方案:COALESCE()+窗口函数(适配PostgreSQL等)

如果需要更灵活的空值填充逻辑,可以用窗口函数结合COALESCE()优先取非空值:

SELECT DISTINCT
    CODE,
    FIRST_VALUE(STATE_DATE1) OVER (PARTITION BY CODE ORDER BY CASE WHEN STATE_DATE1 IS NOT NULL THEN 0 ELSE 1 END) AS STATE_DATE1,
    FIRST_VALUE(STATE_DATE2) OVER (PARTITION BY CODE ORDER BY CASE WHEN STATE_DATE2 IS NOT NULL THEN 0 ELSE 1 END) AS STATE_DATE2,
    FIRST_VALUE(STATE_DATE3) OVER (PARTITION BY CODE ORDER BY CASE WHEN STATE_DATE3 IS NOT NULL THEN 0 ELSE 1 END) AS STATE_DATE3,
    FIRST_VALUE(STATE_DATE4) OVER (PARTITION BY CODE ORDER BY CASE WHEN STATE_DATE4 IS NOT NULL THEN 0 ELSE 1 END) AS STATE_DATE4
FROM 
    your_table_name;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 06:52:44