如何基于标识符将两行合并为一行(无NULL值场景)
合并相同LBID与ADDRESS行并新增FI2、LI2字段的解决方案
针对你的需求——将同一LBID和ADDRESS对应的两行数据合并为一行,新增FI2、LI2字段存储另一行的FI、LI值——可以通过窗口函数+条件聚合或者窗口函数+自连接实现,以下是具体方法:
方法一:条件聚合(推荐)
先给每组相同LBID+ADDRESS的行分配序号,再通过条件聚合提取不同序号的字段值,最终合并为一行。
代码示例
WITH numbered_data AS ( SELECT LBID, ADDRESS, FI, LI, -- 按LBID和ADDRESS分组,给组内每行分配序号(1、2) ROW_NUMBER() OVER (PARTITION BY LBID, ADDRESS ORDER BY FI) AS rn FROM your_table_name -- 替换为你的表名 ) SELECT LBID, ADDRESS, -- 提取序号1的FI和LI作为主字段 MAX(CASE WHEN rn = 1 THEN FI END) AS FI, MAX(CASE WHEN rn = 1 THEN LI END) AS LI, -- 提取序号2的FI和LI作为新增字段 MAX(CASE WHEN rn = 2 THEN FI END) AS FI2, MAX(CASE WHEN rn = 2 THEN LI END) AS LI2 FROM numbered_data GROUP BY LBID, ADDRESS;
说明
- 窗口函数
ROW_NUMBER()确保每组(LBID+ADDRESS)内的行被标记为1和2,排序规则(ORDER BY FI)可根据实际需求调整(比如按LI或主键排序)。 - 条件聚合通过
CASE WHEN筛选对应序号的字段值,再用MAX()确保每组只返回一行结果。
方法二:自连接
同样先给行分配序号,再通过自连接将序号1和序号2的行合并。
代码示例
WITH numbered_data AS ( SELECT LBID, ADDRESS, FI, LI, ROW_NUMBER() OVER (PARTITION BY LBID, ADDRESS ORDER BY FI) AS rn FROM your_table_name -- 替换为你的表名 ) SELECT t1.LBID, t1.ADDRESS, t1.FI, t2.FI AS FI2, t1.LI, t2.LI AS LI2 FROM numbered_data t1 LEFT JOIN numbered_data t2 ON t1.LBID = t2.LBID AND t1.ADDRESS = t2.ADDRESS AND t1.rn = 1 AND t2.rn = 2;
说明
- 自连接通过序号(rn=1和rn=2)精准匹配同组的两行数据,避免出现重复匹配的情况。
- 使用
LEFT JOIN可以兼容只有单行的组(此时FI2、LI2会返回NULL)。
为什么STRING_AGG不适用?
STRING_AGG的作用是将组内多个字段值拼接成一个字符串(比如把两个LI值拼成LI1,LI2),但它无法将不同行的字段拆分为独立的FI2、LI2字段,因此不符合你的需求。
内容的提问来源于stack exchange,提问作者Larinx
相关产品推荐
相关产品推荐

