基于条件将行合并为列的SQL实现问题
解决方案:合并相同Date和Value的设备行
原数据表
| Eqp | Date | Value |
|---|---|---|
| Eqp 1 | 01/12/2024 | 2500 |
| Eqp 2 | 01/12/2024 | 2500 |
期望结果
| Eqp | Another Eqp | Date | Value |
|---|---|---|---|
| Eqp 1 | Eqp 2 | 01/12/2024 | 2500 |
问题分析
你之前用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
相关产品推荐
相关产品推荐

