gpt4 book ai didi

元组的 SQL 重复数据删除列表

转载 作者:行者123 更新时间:2023-12-04 13:07:20 25 4
gpt4 key购买 nike

我有一个包含两列 ID 的表,如下所示:

╔════════╦══════╗
║ Master ║ Dupe ║
╠════════╬══════╣
║ 2 ║ 7 ║
║ 3 ║ 6 ║
║ 6 ║ 7 ║
║ 20 ║ 25 ║
║ 75 ║ 25 ║
╚════════╩══════╝

每行代表 sql 表中被认为彼此重复的两行的 ID。

该表可以包含数千个条目,除了 Master 之外的数据不能保证。列按升序排序,如图。任一列都可以包含与另一列相同的 ID,可能针对不同或相同的合作伙伴 ID。再次 - 没有保证。

从这张表中,我想获得 Master 及其所有可能的欺骗的索引。如下图所示。

预期的结果:
  • 最低的ID应该保留为主
  • 一个dupe的所有后续dupes应该映射回相同的(最低ID)master

  • 对于上述情况,所需的输出如下所示(但不必对列进行排序):
    ╔════════╦══════╗
    ║ Master ║ Dupe ║
    ╠════════╬══════╣
    ║ 2 ║ 3 ║
    ║ 2 ║ 6 ║
    ║ 2 ║ 7 ║
    ║ 20 ║ 25 ║
    ║ 20 ║ 75 ║
    ╚════════╩══════╝

    我发现很难解释这个问题,所以我的谷歌搜索没有回来太多。我认为某处必须有一个算法来迭代这样的元组列表并发现重复。

    任何帮助表示赞赏!

    编辑:我修改了示例表以更好地解释它们的内容可能是什么样子。

    一些注意事项,
  • 没有链的保证。它可以是一个大链式店,很多小链式店,或者根本没有。
  • 不能保证所有对都以相反的顺序出现在表
  • 中的其他地方。

    从我所见,问题似乎是递归的,我认为 LukStorms 走在正确的轨道上,但我无法弄清楚

    回答:虽然下面来自@artm 和@LukStorms 的两个解决方案似乎都有效,但我发现后者更简洁易读。谢谢你们俩!在一个棘手的问题上提供了极大的帮助。我只希望我能将答案授予你们两个

    最佳答案

    尝试这个。使用 CTE 从您的表中获取 master 的 min 并交叉连接到表中的所有其他值。

    ;WITH minmaster as (select MIN(MASTER) master
    FROM myTable)
    select distinct m.master
    , i.dupe
    from minmaster m
    cross join (select dupe dupe from myTable union all select master from myTable) i
    WHERE i.dupe <> m.master

    更新:

    在使用更多行进行编辑后,尽管我不确定这是否是最佳解决方案,但下面的内容仍然有效。逻辑从第一个主副本开始(因为数据按主排序),如果副本存在于第一列不等于当前主的第二列,则采用相同的主,否则采用下一个主。这很难解释,其他人可能会找到更简单的解决方案。
    ;WITH myTable AS 
    (SELECT 2 MASTER, 7 dupe
    UNION all SELECT 3, 6
    UNION all SELECT 6, 7
    UNION all SELECT 20, 25
    UNION all SELECT 75, 25
    UNION all SELECT 100, 125
    UNION all SELECT 150, 300
    UNION all SELECT 180, 300
    )
    , cte AS
    (
    SELECT m.master L, m.dupe R, ROW_NUMBER() OVER (ORDER BY master) rnkC
    FROM myTable m
    )
    , cte2 AS
    (
    SELECT m.master L, m.dupe R, ROW_NUMBER() OVER (ORDER BY master) rnkC2
    FROM myTable m
    )
    , cteCur AS
    (
    SELECT TOP 1 cte.l, cte.R, cte.rnkC
    FROM cte
    UNION ALL
    SELECT
    CASE WHEN cteCur.r IN (SELECT dupe
    FROM myTable
    WHERE MASTER <> cteCur.L AND dupe = cteCur.R)
    THEN cteCur.L
    ELSE (SELECT cte2.L
    FROM cte2
    WHERE cte2.rnkC2 = cteCur.rnkC + 1)
    END
    , CASE WHEN cteCur.r IN (SELECT dupe
    FROM myTable
    WHERE MASTER <> cteCur.L AND dupe = cteCur.R)
    THEN (SELECT cte2.L
    FROM cte2
    WHERE cte2.R = cteCur.R AND cte2.L <> cteCur.L)
    ELSE (SELECT cte2.R
    FROM cte2
    WHERE cte2.rnkC2 = cteCur.rnkC + 1)
    END
    , cteCur.rnkC + 1
    FROM cteCur
    WHERE cteCur.L IS NOT NULL
    )
    SELECT cteCur.L Master
    , cteCur.R Dupe
    FROM cteCur
    WHERE L IS NOT NULL
    ORDER BY L, R

    关于元组的 SQL 重复数据删除列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44514362/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com