查找具有以相同的后四位数结尾的值的重复列 - SQL

时间:2015-11-04 18:47:34

标签: sql oracle duplicates records

我需要一个查询,它将搜索表中的所有记录并仅返回具有2个或更多以相同4位数结尾的值的查询,但我没有特定的四位数我可以给你,我只需要它查找具有多个结束相同值的所有内容。 例如。表有:

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'这样的东西。它也需要正确排序,所以我让它们彼此相邻。我需要找到重复并删除其中一个,但我不知道哪一个,直到我实际上看到其他列中的所有其他值,并选择手动删除哪一个。

谢谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我只想延长病态的回答。

你说你想选择哪一个消除。但是,您还可以添加ORDER关于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
  • 开头的情况