如何获取数据表中行的交集?以多日期列数据表为例
多行数据合并为单行(取字段非空值)
针对你给出的示例数据,要合并相同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
相关产品推荐
相关产品推荐

