首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL -尝试遍历分区以查找重复项

SQL -尝试遍历分区以查找重复项
EN

Stack Overflow用户
提问于 2012-12-20 23:18:44
回答 2查看 921关注 0票数 4

下面是一些示例信息:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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号的结果,但不能完全理解。下面是我想要的表格最后的样子。

代码语言:javascript
复制
    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号。最终结果将是只有ID号在其分区内的其他位置重复的行。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-20 23:53:03

这个怎么样?

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2012-12-23 00:40:51

您还可以使用having

代码语言:javascript
复制
select
    "phone", "id"
from
    "data"
group by "phone", "id"
having ( min ( "row" ) < max( "row" ));

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

请参阅SQL-Fiddle

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13975214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档