SQL:使用附加过滤器查找重复条目
SQL: find duplicate entries with additional filter
我有一个简单的 table 像这样:
Name data
-- ----
A 1
A 2
A null
B 1
B null
C 1
D 1
D 2
E null
E null
我想获取 Name
的列表:
- 与他们相关联的条目不止一个
- 在这些行之一中将数据列字段设置为
null
。 (或数据字段值的任何过滤器)
也就是说,我想 return A, B, E
我可以做第一部分但不知道如何做第二部分。我试过这个:
select Name from Table1
group by Name
having count(*) > 1
and Score is null;
只给我 E
,这还不够好。
我当然可以:
- select 数据为空的完整名称集,作为子查询
- 在group by
前加一个where Name in (...)
类似于:
select Name from Table1
where Name in (
select distinct Name
from Table1
where data is null
)
group by Name
having count(*) > 1;
但这不必要地复杂,但也不够通用。如果我想要至少有两个空条目的条目怎么办?等等
是否有 easy/clean 方法来做到这一点?
考虑到您对“如果……至少有两个空条目”的额外要求,我建议使用条件聚合。
select Name from Table1
group by Name
having count(*) > 1 AND SUM(CASE WHEN data IS NULL THEN 1 ELSE 0 END) > 0
这使它足够灵活,您只需将 > 0
更改为 > 1
(或任何其他数字)。
您可以对两个条件进行交集
(select Name from Table1
group by Name
having count(*) > 1)
INTERSECT
(select Name from Table1
where Score is null)
count(*)
计算所有行数。
count(Score)
计数 non-null 分数值。
select Name from Table1
group by Name
having count(*) > 1 -- more than 1 row
and count(*) > count(Score) -- and at least 1 null
如果您想添加至少两个空条目:
select Name from Table1
group by Name
having count(*) >= count(Score) + 2 -- at least 2 null values
我有一个简单的 table 像这样:
Name data
-- ----
A 1
A 2
A null
B 1
B null
C 1
D 1
D 2
E null
E null
我想获取 Name
的列表:
- 与他们相关联的条目不止一个
- 在这些行之一中将数据列字段设置为
null
。 (或数据字段值的任何过滤器)
也就是说,我想 return A, B, E
我可以做第一部分但不知道如何做第二部分。我试过这个:
select Name from Table1
group by Name
having count(*) > 1
and Score is null;
只给我 E
,这还不够好。
我当然可以:
- select 数据为空的完整名称集,作为子查询
- 在group by 前加一个
where Name in (...)
类似于:
select Name from Table1
where Name in (
select distinct Name
from Table1
where data is null
)
group by Name
having count(*) > 1;
但这不必要地复杂,但也不够通用。如果我想要至少有两个空条目的条目怎么办?等等
是否有 easy/clean 方法来做到这一点?
考虑到您对“如果……至少有两个空条目”的额外要求,我建议使用条件聚合。
select Name from Table1
group by Name
having count(*) > 1 AND SUM(CASE WHEN data IS NULL THEN 1 ELSE 0 END) > 0
这使它足够灵活,您只需将 > 0
更改为 > 1
(或任何其他数字)。
您可以对两个条件进行交集
(select Name from Table1
group by Name
having count(*) > 1)
INTERSECT
(select Name from Table1
where Score is null)
count(*)
计算所有行数。
count(Score)
计数 non-null 分数值。
select Name from Table1
group by Name
having count(*) > 1 -- more than 1 row
and count(*) > count(Score) -- and at least 1 null
如果您想添加至少两个空条目:
select Name from Table1
group by Name
having count(*) >= count(Score) + 2 -- at least 2 null values