Найти дубликаты, отобразить каждый результат в sql - PullRequest
2 голосов
/ 11 ноября 2011

Я хочу написать что-то вроде этого:

select t.id, t.name, from table t
group by t.name having count(t.name) > 1

Производить следующее:

id      name  count 
904834  jim    2
904835  jim    2
90145   Fred   3
90132   Fred   3
90133   Fred   3

Ответы [ 5 ]

7 голосов
/ 11 ноября 2011

Для SQL Server 2005+ вы можете сделать следующее:

SELECT *
FROM (SELECT id, Name, COUNT(*) OVER(PARTITION BY Name) [Count]
      FROM table) t
WHERE [Count]>1
3 голосов
/ 11 ноября 2011

Если вы удалите столбец ID, то вы можете получить все имена, которые имеют несколько записей

select t.name
from table t
group by t.name
having count(t.name) > 1

Для каждого имени, если вы хотите минимальный или максимальный id, вы можете сделать это

select t.id, t.name, min (t.id) as min_id, max (t.id) as max_id
from table t
group by t.name
having count(t.name) > 1

Для каждого имени, если вы хотите, чтобы все идентификаторы были дубликатами, вы должны использовать подзапрос

select t.id, t.name
from table t
where name in
(
    select t1.name
    from table t1
    group by t1.name
    having count(t1.name) > 1
)
2 голосов
/ 11 ноября 2011

Просто присоедините таблицу к подзапросу, извлекающему счет для каждого имени

SELECT t.ID, t.Name, d.Count
FROM #MyTable t
JOIN 
(
SELECT name, COUNT(*) as Count
FROM #MyTable 
GROUP BY Name
HAVING COUNT(*) > 1
) D 
ON t.Name = d.Name
1 голос
/ 11 ноября 2011

Предполагая mysql (когда я писал ответ, я не думаю, что человек указал dbms)

<code>SELECT t.id, t.name, (SELECT COUNT(t2.name) FROM test t2 ) AS t_count
FROM  test t
HAVING t_count > 1;
0 голосов
/ 29 декабря 2015

Пожалуйста, проверьте это один раз .... в SQL Server 2008

SELECT   t.id, 
         t.NAME, 
         Count(t.id)   AS duplicate id, 
         count(t.NAME) AS duplicate names 
FROM     t 
GROUP BY t.id, 
         t.NAME 
HAVING   count(t.NAME) > 1
...