查找具有以相同的最后四位数字结尾的值的重复列 - 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
删除所有内容并保留名字。
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 开头的情况
我需要一个查询来搜索 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
删除所有内容并保留名字。
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 开头的情况