同ID两行不同值,将第二个值移至另一列的SQL查询需求
解决同一ID多行数据合并为单行的SQL方案
针对你提出的需求——把每个ID对应的第二行Value提取到第一行的新列中,我整理了几种实用的SQL实现方法,你可以根据自己使用的数据库版本和实际数据情况选择:
方法一:使用窗口函数(通用现代数据库)
这是最灵活的方案,支持MySQL 8+、PostgreSQL、SQL Server等几乎所有现代数据库,还能自定义行的排序规则:
WITH numbered_rows AS ( SELECT ID, Value, -- 按ID分组,给每行编号,这里假设按Value升序确定第一/第二行 ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Value) AS row_num FROM your_table_name ) SELECT nr_main.ID, nr_main.Value, nr_second.Value AS `Value 1` FROM numbered_rows nr_main LEFT JOIN numbered_rows nr_second ON nr_main.ID = nr_second.ID AND nr_main.row_num = 1 AND nr_second.row_num = 2 WHERE nr_main.row_num = 1;
注意:如果你的数据有明确的行顺序依据(比如创建时间create_time),把ORDER BY Value改成ORDER BY create_time会更准确。
方法二:自连接(兼容老版本数据库)
如果你的数据库不支持窗口函数(比如MySQL 5.x),可以用自连接的方式实现,适合每个ID刚好只有两行的场景:
SELECT t_first.ID, t_first.Value, t_second.Value AS `Value 1` FROM your_table_name t_first JOIN your_table_name t_second ON t_first.ID = t_second.ID AND t_first.Value < t_second.Value -- 确保t_first是每个ID的第一行(这里用最小Value判断) WHERE NOT EXISTS ( SELECT 1 FROM your_table_name t_check WHERE t_check.ID = t_first.ID AND t_check.Value < t_first.Value );
方法三:聚合函数(极简方案)
如果每个ID确实只有两行数据,且你确定第一行是较小的Value、第二行是较大的Value,用聚合函数是最简洁的:
SELECT ID, MIN(Value) AS Value, MAX(Value) AS `Value 1` FROM your_table_name GROUP BY ID;
记得把代码里的your_table_name替换成你实际使用的表名哦!
内容的提问来源于stack exchange,提问作者ipedrosa
相关产品推荐
相关产品推荐

