You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SQL合并重复ID行至带多列的唯一行的实现方案求助

解决SQL行转列合并的问题

嗨,这个需求其实就是把同一ID下的两行数据合并成一行,把第二行的R1/R2转成新的列R3/R4对吧?我给你两种实用的解决办法,你可以根据自己使用的数据库来选:

方法一:自连接(Self Join)

如果每个ID固定只有两行数据,我们可以把表和自己做连接,分别取出每行的内容。为了更通用(避免依赖R1的具体值),可以先用窗口函数给每行加个行号:

WITH numbered_rows AS (
    SELECT 
        ID, R1, R2,
        ROW_NUMBER() OVER (PARTITION BY ID ORDER BY R1) AS rn
    FROM your_table -- 记得替换成你的实际表名
)
SELECT 
    t1.ID,
    t1.R1,
    t1.R2,
    t2.R1 AS R3,
    t2.R2 AS R4
FROM numbered_rows t1
JOIN numbered_rows t2 
    ON t1.ID = t2.ID 
    AND t1.rn = 1 
    AND t2.rn = 2;

这里的ORDER BY R1是用来确定行号顺序的,如果你的数据里有更合适的排序字段(比如插入时间),直接替换掉就行。

方法二:条件聚合(Conditional Aggregation)

这种方法更灵活,就算以后ID下的行数有变化也容易调整。核心思路是用聚合函数配合CASE语句,按行号提取对应的值:

SELECT 
    ID,
    MAX(CASE WHEN rn = 1 THEN R1 END) AS R1,
    MAX(CASE WHEN rn = 1 THEN R2 END) AS R2,
    MAX(CASE WHEN rn = 2 THEN R1 END) AS R3,
    MAX(CASE WHEN rn = 2 THEN R2 END) AS R4
FROM (
    SELECT 
        ID, R1, R2,
        ROW_NUMBER() OVER (PARTITION BY ID ORDER BY R1) AS rn
    FROM your_table -- 替换成实际表名
) AS sub_query
GROUP BY ID;

两种方法都能得到你想要的结果,要是你用的是特定数据库(比如MySQL、SQL Server),有些语法可能微调,但核心逻辑是一样的~

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

火山引擎 最新活动