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

Find duplicate columns that have values that end with same last four digits - SQL

我需要一个查询来搜索 table 和 return 中的所有记录,仅搜索具有 2 个或更多以相同 4 位数字结尾的值的记录,但我没有具体的四个我可以给你的数字,我只需要它来找到具有多个以相同结尾的值的所有内容。 例如。 table 有:

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

我只想 return:

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

你看,我希望它 return 以相同的最后 4 位数字结尾的副本,但我没有特定的数字可以给你,所以我不能使用类似“%9999”的数字。它也需要正确排序,所以我把它们放在一起。我需要找到重复项并删除其中一个,但直到我真正看到其他列中的所有其他值并选择手动删除哪个时,我才知道是哪一个。

谢谢!

试试这个

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

我只想延长生病的答案。

你说你要选择淘汰哪一个。但是您也可以包含一个 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 开头的情况