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

如何基于标识符将两行合并为一行(无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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 04:32:56