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 的列表:

也就是说,我想 return A, B, E

我可以做第一部分但不知道如何做第二部分。我试过这个:

select Name from Table1
group by Name
having count(*) > 1
and Score is null;

只给我 E,这还不够好。

我当然可以:

类似于:

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(或任何其他数字)。

DEMO (with MySQL)

您可以对两个条件进行交集

(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