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

基于条件将行合并为列的SQL实现问题

解决方案:合并相同Date和Value的设备行

原数据表

EqpDateValue
Eqp 101/12/20242500
Eqp 201/12/20242500

期望结果

EqpAnother EqpDateValue
Eqp 1Eqp 201/12/20242500

问题分析

你之前用ROW_NUMBER()和CASE WHEN的思路方向正确,但缺少按Date和Value分组聚合的步骤,导致每条记录单独输出,出现NULL和重复行。

正确实现方案

方案一:窗口函数+聚合函数

先给同一Date和Value组内的设备排序,再通过聚合函数将不同行的设备合并到同一行:

WITH ranked_data AS (
    SELECT 
        Eqp,
        Date,
        Value,
        -- 按Date和Value分组,给设备排序
        ROW_NUMBER() OVER (PARTITION BY Date, Value ORDER BY Eqp) AS rn
    FROM your_table
)
SELECT
    -- 取组内第1个设备作为Eqp列
    MAX(CASE WHEN rn = 1 THEN Eqp END) AS Eqp,
    -- 取组内第2个设备作为Another Eqp列
    MAX(CASE WHEN rn = 2 THEN Eqp END) AS Another_Eqp,
    Date,
    Value
FROM ranked_data
-- 按Date和Value分组聚合,合并行
GROUP BY Date, Value;

方案二:自连接

通过自连接关联同一Date和Value的不同设备,直接得到合并结果:

SELECT
    t1.Eqp,
    t2.Eqp AS Another_Eqp,
    t1.Date,
    t1.Value
FROM your_table t1
JOIN your_table t2 
    ON t1.Date = t2.Date 
    AND t1.Value = t2.Value 
    AND t1.Eqp < t2.Eqp; -- 避免重复配对(如Eqp1-Eqp2和Eqp2-Eqp1)

补充说明

  • 如果同一Date和Value组内有超过2个设备,方案一可以扩展CASE WHEN条件(如rn=3对应第三列),方案二则需要调整逻辑处理多设备场景。
  • 方案一兼容性更好,适用于大多数SQL数据库(MySQL、PostgreSQL、SQL Server等)。

内容的提问来源于stack exchange,提问作者Gabriel G. Martins

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 18:14:59