我有一个包含系统和订单号列的表,该表不是唯一的。我想根据订单号连接系统
+----------------------+
¦ system ¦OrderNo¦
¦--------------+-------+
¦ system1 ¦ 1 ¦
¦ system2 ¦ 2 ¦
¦ system3 ¦ 3 ¦
¦ system4 ¦ 4 ¦
¦ system1 ¦ 1 ¦
¦ system2 ¦ 2 ¦
¦ system5 ¦ 1 ¦
¦ system6 ¦ 2 ¦
¦ system7 ¦ 1 ¦
¦ system8 ¦ 2 ¦
+----------------------+
如何基于OrderNo列生成父子关系。其中1-2-3-4是一组,而1-2,1-2,1-2是另一组
所需的输出如下
+----------------------+
¦ Parent ¦Child ¦
¦--------------+-------+
¦ system1 ¦system2¦
¦ system2 ¦system3¦
¦ system3 ¦system4¦
¦ system4 ¦NULL ¦
¦ system1 ¦system2¦
¦ system2 ¦NULL ¦
¦ system5 ¦system6¦
¦ system6 ¦NULL ¦
¦ system7 ¦system8¦
¦ system8 ¦NULL ¦
+----------------------+
答案 0 :(得分:0)
正如我在评论中提到的那样,如果只有这些专栏,那么您追求的目标是无法实现的。如果没有某种升序的唯一键,则无法确定关系。如果我们 要做 添加唯一的升序键,那么我们可以实现这一点。
如果您使用的是SQL Server 2012+(2008年不再受支持,并且即将终止扩展支持,那么现在升级应该是非常优先的),那么您可以使用{{1} },然后使用ROWS BETWEEN
:
LEAD
如果无法访问CREATE TABLE dbo.SampleTable (ID int IDENTITY(1,1),
[system] varchar(8),
OrderNo int);
INSERT INTO dbo.SampleTable([System],OrderNo)
VALUES('system1',1),
('system2',2),
('system3',3),
('system4',4),
('system1',1),
('system2',2),
('system5',1),
('system6',2),
('system7',1),
('system8',2);
GO
WITH Groups AS(
SELECT ID,
[System],
COUNT(CASE WHEN OrderNo = 1 THEN 1 END) OVER (ORDER BY ID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Grp
FROM dbo.SampleTable)
SELECT [System] AS Parent,
LEAD([System]) OVER (PARTITION BY Grp ORDER BY ID) AS Child
FROM Groups;
GO
和LEAD
,则必须更具创造力;而且解决方案的速度会慢得多:
ROWS BETWEEN