2015-11-04 168 views
0

我需要一个查询来搜索表中的所有记录,并只返回具有两个或更多以相同4位数结尾的值的查询,但我没有具体的四位数字,我可以给你,我只是需要它来找到所有具有不止一个值的结果。 例如。表有:查找具有以最后四位数字结尾的值的重复列 - SQL

person_number------------name 
============================== 
1234567------------------john 
00004567-----------------mark 
9999999------------------mike 
0009999------------------lidia 
10101010-----------------alex 
23232323-----------------matt 
98748484-----------------steve 

我希望它只是返回:

person_number------------name 
============================== 
1234567------------------john 
00004567-----------------mark 
9999999------------------mike 
0009999------------------lidia 

你看,我希望它返回以相同的最后4位数字结尾的重复,但我没有具体的数字来给你所以我不能使用'%9999'之类的东西。它也需要正确排序,所以我把它们放在一起。我需要找到重复项并删除其中的一个,但我不知道哪一个,直到我实际上看到其他列中的所有其他值,并选择手动删除哪一个。

谢谢!

+0

做基于右一ROW_COUNT([PersonNumber],4)具有ROWNUMBER> 1 – lookslikeanevo

回答

0

我只是想延长病假的答案。

你说你想选择哪一个消除。但你也可以包含一个ORDER clausule和一个CASE陈述来过滤你想要消除的那个。

在这种情况下,我通过"name"订购,因此您可以用rn > 1删除所有,并保留名。

SqlFiddleDemo

select "person_number", "name", rn, zero_count 
from 
(
    select "person_number", 
     "name", 
     substr("person_number", 1, 1), 
     count(1) over (partition by substr("person_number",-4)) as Cnt, 
     SUM(case 
      when substr("person_number", 1, 1) = '0' then 1 
      else 0 end) over (partition by substr("person_number",-4)) as zero_count, 
      row_number() over (partition by substr("person_number",-4) order by "name") as rn 
    from person 
) 
Where Cnt > 1 
and zero_count > 0 
ORDER BY substr("person_number",-4) 

我增加数据样本

  • 现在包括场zero_count来计算有多少行与0每组开始
  • 情况下都行具有相同最后4个字符,也以0开头(ZERO_COUNT = 2
  • 情况下,当不匹配的行也从0开始
+0

这几乎是我需要的,但它返回的结果太多了,它需要一些缩小范围。需要添加的条件是person_number列中的其中一个值以0开头。因此:从零开始,但它们都有最后4位数字。例如011112345和8888888882345.此外,我希望这可以显示所有列,因为此表有大约50个不同的列,但这不是我的优先级,因为我可以手动在脚本中添加列。 – Aleks

+0

@Aleks这是唯一的附加要求?因为我担心你会在每次尝试后继续添加规则 –

+0

对不起Juan,但我认为这将是它。我有重复的记录,其中一个以0开头,但另一个不是,所以我必须在查看它们之后删除其中的一行。所以是的,我认为这只是要求。 – Aleks

3

试试这个

select person_number,name 
from 
(
    select person_number,name,count(1)over(partition by right(person_number,4)) as Cnt 
    from YourTable 
) 
Where Cnt > 1 
+0

'为了通过右(person_number,4)'。 –