将重复匹配对分组到单个组中 - SQL

时间:2014-08-12 15:11:26

标签: mysql sql cursor duplicates

第一篇文章就在这里!

我想了解的是如何在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,因此它位于该测试集的新组中。

我想我可能需要使用游标循环?

非常感谢大家的任何意见。 谢谢 汤姆

1 个答案:

答案 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;