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

SQL如何合并存在缺失的同Cd、MeasNr分组行并按StNr加字段前缀

SQL缺失站点行合并解决方案

最优方案:条件聚合(行转列)

这种方案兼容性最强,写法简洁,不需要处理多表JOIN的关联逻辑,天然可以解决站点缺失的问题:

SELECT
  Cd,
  MeasNr,
  MAX(CASE WHEN StNr = 1 THEN Var1 ELSE NULL END) AS st1_Var1,
  MAX(CASE WHEN StNr = 1 THEN Var2 ELSE NULL END) AS st1_Var2,
  MAX(CASE WHEN StNr = 1 THEN Var3 ELSE NULL END) AS st1_Var3,
  MAX(CASE WHEN StNr = 2 THEN Var1 ELSE NULL END) AS st2_Var1,
  MAX(CASE WHEN StNr = 2 THEN Var2 ELSE NULL END) AS st2_Var2,
  MAX(CASE WHEN StNr = 2 THEN Var3 ELSE NULL END) AS st2_Var3,
  MAX(CASE WHEN StNr = 3 THEN Var1 ELSE NULL END) AS st3_Var1,
  MAX(CASE WHEN StNr = 3 THEN Var2 ELSE NULL END) AS st3_Var2,
  MAX(CASE WHEN StNr = 3 THEN Var3 ELSE NULL END) AS st3_Var3
FROM Measurements
GROUP BY Cd, MeasNr
ORDER BY Cd, MeasNr

逻辑说明

同一个Cd + MeasNr分组下,每个StNr只会对应一行数据,用MAX/MIN聚合可以跳过NULL值,精准取出对应站点的变量值,哪怕某个站点完全不存在该分组的记录,也会自动填充NULL,不会漏掉分组。

原FULL JOIN写法的问题修复

你之前的FULL JOIN没有得到正确结果,是因为第二次关联st3的时候,只判断了和st1的匹配关系,当分组不存在StNr=1的记录时,st2的记录无法和st3的同分组记录关联,就会拆分为两行。修正关联条件即可:

SELECT 
  COALESCE(st1.DtTm, st2.DtTm, st3.DtTm) AS DtTime,
  COALESCE(st1.Cd, st2.Cd, st3.Cd) AS Cd,
  COALESCE(st1.MeasNr, st2.MeasNr, st3.MeasNr) AS MeasNr,
  st1.Var1 AS st1_Var1,
  st1.Var2 AS st1_Var2,
  st1.Var3 AS st1_Var3,
  st2.Var1 AS st2_Var1,
  st2.Var2 AS st2_Var2,
  st2.Var3 AS st2_Var3,
  st3.Var1 AS st3_Var1,
  st3.Var2 AS st3_Var2,
  st3.Var3 AS st3_Var3
FROM (SELECT * FROM Measurements WHERE StNr = 1) AS st1
FULL JOIN (SELECT * FROM Measurements WHERE StNr = 2) AS st2 
  ON st1.Cd = st2.Cd AND st1.MeasNr = st2.MeasNr
FULL JOIN (SELECT * FROM Measurements WHERE StNr = 3) AS st3 
  ON COALESCE(st1.Cd, st2.Cd) = st3.Cd AND COALESCE(st1.MeasNr, st2.MeasNr) = st3.MeasNr
ORDER BY Cd, MeasNr

这里用COALESCE代替了冗余的CASE判断,同时修正了st3的关联条件,优先取st1或st2的分组字段和st3匹配,就能保证同组数据合并到同一行。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 19:27:02