我有以下数据:
ID Site
2 NULL
2 32
3 6
4 7
8 12
8 13
9 14
9 14
结果应该是:
ID Site
2 NULL
2 32
8 12
8 13
请注意,结果会找到 ID 和站点的唯一组合,这些组合对于给定 ID 重复多次。
我做了以下查询,但没有返回结果:
select distinct id, site
from Table1
group by id, site
having count(*) > 1
order by id
回答1
SELECT
ID,
site
FROM table1
WHERE ID IN (
SELECT ID
FROM (
SELECT ID ,site
FROM table1
GROUP BY ID ,site
) x
GROUP BY ID
HAVING count(*)>1
)
请参阅:https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=931766218059a48489c5e148fc4e9a17
SELECT ID, site FROM table1 GROUP BY ID, site
将选择不同的 values。- 然后,使用
HAVING count(*) > 1
,只过滤多次出现的 ID。
附言您应该尽量避免在一个查询中使用 DISTINCT
和 GROUP BY
。当你这样做时,它会让生活变得更加复杂......?
回答2
一种方法是在 CTE 中执行 select distinct
,然后使用 count
窗口函数来获得所需的结果:
with u as (
select distinct *
from Table1
), v as (
select *
, count(*) over(partition by ID) as cnt
from u
)
select ID, Site
from v
where cnt > 1;
https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=85087768be683e42d9e620ec82492c31