【问题标题】:Find duplicate columns that have values that end with same last four digits - SQL查找具有相同最后四位数字结尾的值的重复列 - SQL
【发布时间】:2016-02-05 09:51:08
【问题描述】:

我需要一个查询来搜索表中的所有记录并仅返回具有 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”这样的东西。它还需要正确分类,所以我把它们放在一起。我需要找到重复项并删除其中一个,但我不知道是哪一个,直到我真正看到其他列中的所有其他值并选择手动删除哪个。

谢谢!

【问题讨论】:

  • 根据右边([PersonNumber],4) 做一个row_count,rownumber > 1

标签: sql oracle duplicates records


【解决方案1】:

试试这个

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

【讨论】:

    【解决方案2】:

    我只想扩展 Sick 的答案。

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

    【讨论】:

    • 这几乎是我需要的,但它返回的结果太多,需要缩小范围。需要添加的条件是 person_number 列中的这些值之一以 0 开头。所以:1 以 0 开头,但它们的最后 4 位数字相同。例如 011112345 和 8888888882345。此外,我希望它显示所有列,因为该表有大约 50 个不同的列,但这不是我的优先事项,因为我可以手动在脚本中添加列。
    • @Aleks 这是唯一的附加要求吗?因为我怕你每次尝试后都会继续添加规则
    • 对不起,胡安,但我想就这样吧。我有重复的记录,其中一个以 0 开头,但另一个没有,所以我必须在查看它们之后删除其中的一行。所以是的,我认为这些只是要求。
    • 你想删除那些有 0 的?
    • 在我看到记录之前我不会知道。对于其中一些,我必须删除带有零的那个,而对于其他一些,我必须删除不带零的那个,然后从第一个中删除零并提交。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 2016-05-21
    • 2013-11-25
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    相关资源
    最近更新 更多