【问题标题】:SQL - Trying to iterate through partitions to find duplicatesSQL - 尝试遍历分区以查找重复项
【发布时间】:2012-12-23 00:40:50
【问题描述】:

所以这里有一些示例信息:

ROW  |     PHONE     |   ID   |  NAME
_________________________________________
1      000-000-0000      3     Company1
2      000-000-0000     38     Company2
1      123-456-7890      0     Company3
2      123-456-7890      0     Company4
3      123-456-7890      0     Company5
1      197-865-4329      0     Company6
2      197-865-4329     18     Company7
1      654-987-1230     74     Company8
2      654-987-1230      2     Company9
1      951-753-8462      2     Company10
2      951-753-8462      3     Company11
3      951-753-8462      3     Company12
4      951-753-8462      3     Company13

此信息是使用以下代码从表中提取的:

USE MyTable
GO

SELECT ROW_NUMBER() OVER (PARTITION BY AI.telephone1 ORDER BY AI.telephone1) AS Row
        ,AI.telephone1 AS [Main Phone #]
        ,AI.new_id AS [ID]
        ,AI.name AS [Account Name]
        ,AI.emailaddress1 AS [Email Address]
        ,AI.contactname AS [Primary Contact]
FROM AccountsInfo AI
WHERE AI.telephone1 IN (
        SELECT telephone1
        FROM MyDatabase.dbo.AccountsInfo AI
        WHERE telephone1 != 'NULL'
            AND telephone1 != '--'
        GROUP BY telephone1
        HAVING COUNT(*) > 1
        )
ORDER BY telephone1

我现在需要做的是遍历每个分区并仅提取具有匹配 ID 号的结果,但我无法理解。请参阅下面的表格,了解我希望表格最终的样子...

    PHONE    |   ID   |   NAME
_________________________________________
123-456-7890      0      Company3
123-456-7890      0      Company4
123-456-7890      0      Company5
951-753-8462      3      Company11
951-753-8462      3      Company12
951-753-8462      3      Company13

如您所见,公司 3、4 和 5 都进入了结果,因为它们三个的 ID 号和电话号码都匹配。公司 11、12 和 13 将其划分为分区,因为它们具有匹配的 ID 号。公司 10 未被拉出,因为它的 ID 号与 11、12 和 13 不同。

我需要做的是让代码遍历每个分区(按电话号码分区)并检查分区中每行的 ID 号与分区中的其他行。最终结果将是只有 ID 号在其分区内其他地方重复的行。

如果您需要任何其他信息,请告诉我。

【问题讨论】:

    标签: sql-server-2008 tsql duplicates


    【解决方案1】:

    这个怎么样?

    SELECT   AI.telephone1 AS [Main Phone #]
            ,AI.new_id AS [ID]
            ,AI.name AS [Account Name]
            ,AI.emailaddress1 AS [Email Address]
            ,AI.contactname AS [Primary Contact]
    FROM AccountsInfo AI
    INNER JOIN 
    (
            SELECT telephone1,new_id
            FROM MyDatabase.dbo.AccountsInfo AI
            WHERE telephone1 != 'NULL'
                AND telephone1 != '--'
            GROUP BY telephone1, new_id
            HAVING COUNT(*) > 1
    ) T
    ON AI.telephone1 = T.telephone1
    AND AI.new_id = T.new_id
    ORDER BY AI.telephone1
    

    【讨论】:

    • 这看起来像它做到了!万分感谢!我们得到了超过 20,000 个结果(这很好),所以如果我调整它,我会报告回来。
    【解决方案2】:

    你也可以使用having:

    select
        "phone", "id"
    from
        "data"
    group by "phone", "id"
    having ( min ( "row" ) < max( "row" ));
    

    有关更多信息和可能性,请查看Joe Celko's Thinking in Sets

    SQL-Fiddle

    【讨论】:

      猜你喜欢
      • 2015-03-21
      • 2018-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多