【发布时间】:2022-01-10 19:11:36
【问题描述】:
我的 SQL Server 表如下所示:
id Distance a b Grp
--------------------------------
1 0.0000000000 100 114 NULL
2 0.1000000000 64 125 NULL
3 0.1000000000 88 100 NULL
4 0.1000000000 65 125 NULL
5 0.1000000000 63 64 NULL
6 0.1000000000 65 66 NULL
7 0.2000000000 63 66 NULL
8 0.2000000000 10 61 NULL
9 0.2000000000 19 61 NULL
10 0.2000000000 30 61 NULL
11 0.2000000000 10 65 NULL
12 0.2000000000 10 94 NULL
13 0.2000000000 19 65 NULL
14 0.2000000000 19 94 NULL
15 0.2000000000 30 94 NULL
16 0.2000000000 60 94 NULL
17 0.2000000000 61 94 NULL
Grp栏应填写如下
-
第一条记录
Grp是1 -
如果 a & b 的下一行的值在前面的任何行中,那么它将采用第一行
Grp值 -
如果下一行的 a 和 b 的值不在前面的任何行中,则
Grp的值将是max Grp + 1 -
如果记录 id = 3,则 b = 100 的值存在于前几行中,它出现的第一个是 id = 1,即
Grp = 1,因此对于 id 3,Grp将是 1
我的桌子应该是这样的:
id Distance a b Grp
--------------------------------
1 0.0000000000 100 114 1
2 0.1000000000 64 125 2
3 0.1000000000 88 100 1
4 0.1000000000 65 125 2
5 0.1000000000 63 64 2
6 0.1000000000 65 66 2
7 0.2000000000 63 66 2
8 0.2000000000 10 61 3
9 0.2000000000 19 61 3
10 0.2000000000 30 61 3
11 0.2000000000 10 65 2
12 0.2000000000 10 94 3
13 0.2000000000 19 65 2
14 0.2000000000 19 94 3
15 0.2000000000 30 94 3
16 0.2000000000 60 94 3
17 0.2000000000 61 94 3
我已经构建了这个运行良好的脚本,但是它非常慢,有什么方法可以让它变得更好(没有循环)?
DECLARE @T AS TABLE
(
id int IDENTITY,
Distance decimal(18, 10),
a int,
b int,
Grp int
)
INSERT INTO @T(Distance, a, b)
SELECT Distance, a, b
FROM MyTable
ORDER BY Distance
UPDATE @T
SET Grp = 1
WHERE id = 1
DECLARE @i int = 2, @max int, @min int,
@grp int, @a int, @b int, @maxgrp int = 1
SELECT @max = MAX(id) FROM @T
WHILE @i <= @max
BEGIN
SELECT @a = a, @b = b
FROM @T
WHERE id = @i
SELECT @min = MIN(id)
FROM @T
WHERE id < @i AND a IN (@a, @b) OR b IN (@a, @b)
SELECT @grp = grp
FROM @T
WHERE id = @min
IF @grp IS NULL
BEGIN
SET @maxgrp = @maxgrp + 1
SET @grp = @maxgrp
END
UPDATE @T
SET Grp = @grp
WHERE id = @i
SET @i = @i + 1
END
SELECT * FROM @T
【问题讨论】:
-
为什么第 12 行是第 3 组?它有一个 10,到那时它是第 2 组和第 3 组的成员?
-
第 12 行具有 a=10 和 b=94.. 显示的这些值中的任何一个(最小 ID)的第一条记录是 id = 8 的记录,其 Grp = 3
标签: sql sql-server tsql sql-update