如何将数据表相邻行的ObjectID、TypeID两列合并到同一行展示
实现方案
你这个需求可以通过SQL语句实现,根据你使用的数据库版本不同,有两种常用实现方式:
方式一:支持窗口函数的数据库(MySQL 8.0+、PostgreSQL、SQL Server、Oracle等通用)
核心逻辑是先给所有行按ID升序排序,用LEAD窗口函数取当前行的下一行对应字段值,最后筛选奇数行即可实现两两合并:
WITH numbered_rows AS ( SELECT RulesID, ObjectID, TypeID, ROW_NUMBER() OVER(ORDER BY ID ASC) AS rn, LEAD(ObjectID) OVER(ORDER BY ID ASC) AS next_obj, LEAD(TypeID) OVER(ORDER BY ID ASC) AS next_type FROM 你的实际表名 ) SELECT RulesID, ObjectID, TypeID, next_obj AS ObjectID2, next_type AS TypeID2 FROM numbered_rows WHERE rn % 2 = 1;
如果你的数据存在多个不同的RulesID,需要按RulesID分别合并,只需要在ROW_NUMBER和LEAD的窗口函数里增加PARTITION BY RulesID即可。
方式二:不支持窗口函数的低版本数据库(比如MySQL 5.x)
可以用自定义变量生成行号后自连接实现:
SELECT t1.RulesID, t1.ObjectID, t1.TypeID, t2.ObjectID AS ObjectID2, t2.TypeID AS TypeID2 FROM ( SELECT *, @rn := @rn + 1 AS rn FROM 你的实际表名, (SELECT @rn := 0) AS init ORDER BY ID ASC ) AS t1 LEFT JOIN ( SELECT *, @rn2 := @rn2 + 1 AS rn FROM 你的实际表名, (SELECT @rn2 := 0) AS init ORDER BY ID ASC ) AS t2 ON t1.rn + 1 = t2.rn WHERE t1.rn % 2 = 1;
以上两种方案执行后的输出结果和你给出的预期完全一致。
内容的提问来源于stack exchange,提问作者embarcadero
相关产品推荐
相关产品推荐

