第一篇文章就在这里!
我想了解的是如何在SQL Server中为整个组ID分配不同的重复项配对?
例如,我有下表:
Test | ID | Pair
A 34 1
A 84 1
A 34 2
A 88 2
A 36 3
A 88 3
A 40 4
A 42 4
B 34 1
B 98 1
我希望能够做的是按照“X与Y匹配,但Y也与Z匹配,因此X也匹配Z”的概念对它们进行分组。所以我得到了类似的东西:
Test | ID | NewGroupID
A 34 1
A 84 1
A 34 1
A 88 1
A 36 1
A 88 1
A 40 2
A 42 2
B 34 1
B 98 1
你注意到在上面的例子中,对于测试A 34匹配84和34匹配88,但88也匹配36,所以ID为34,84,88,36都是一组。 ID 34也与ID 98匹配,但这适用于测试B,因此它位于该测试集的新组中。
我想我可能需要使用游标循环?
非常感谢大家的任何意见。 谢谢 汤姆
答案 0 :(得分:0)
这是在MySQL 5.6.19中测试的SELECT语句,适用于您的测试数据。请注意,您需要test, pair, ID
上的唯一键或主键,以确保以正确的顺序处理数据。它不是最优雅的代码,如果您提供的测试数据不具代表性,可能会变薄或需要调整。
SET @pg=1;
SET @t='A';
SET @pairs="1";
SELECT pg.test AS Test,
p.ID,
pg.pair_group AS NewGroupID
FROM
pairs p
LEFT
JOIN (
SELECT DISTINCT pair,
pair_group,
test
FROM (
SELECT test,
pair,
IF(FIND_IN_SET(pair, @pairs), @pg, IF(pair_sets.test = @t, @pg:=@pg+1, @pg:=1)) pair_group,
@pairs:=pairs,
@t:=test
FROM (
SELECT t.test,
p.pair,
GROUP_CONCAT(p.pair) pairs
FROM (
SELECT DISTINCT(test) from pairs ORDER BY test) AS t
LEFT
JOIN pairs p ON p.test = t.test
GROUP
BY t.test,
p.id
ORDER
BY t.test,
p.pair,
pairs
) AS pair_sets
) AS pair_groups
) AS pg ON pg.pair = p.pair AND pg.test = p.test;