Поиск дубликатов, отображение каждого результата в sql

#sql #sql-server-2008-r2 #aggregate-functions

#sql #sql-server-2008-r2 #агрегатные функции

Вопрос:

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

 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
  

Ответ №1:

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

 SELECT *
FROM (SELECT id, Name, COUNT(*) OVER(PARTITION BY Name) [Count]
      FROM table) t
WHERE [Count]>1
  

Ответ №2:

Если вы удалите столбец 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
)
  

Комментарии:

1. спасибо, но я хочу столбец id, это своего рода суть вопроса

Ответ №3:

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

 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
  

Ответ №4:

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

 SELECT t.id, t.name, (SELECT COUNT(t2.name) FROM test t2 ) AS t_count
FROM  test t
HAVING t_count > 1;
  

Ответ №5:

Аналогично предыдущим ответам с меньшим количеством кода. Протестировано на SQL Server 2008:

 SELECT t.id, t.name,COUNT(*) 
FROM table t
GROUP BY t.id, t.name
HAVING COUNT(t.id) > 1
  

Комментарии:

1. Я не думаю, что это дает те же результаты, что и запрошенный OP.

2. Это моя лучшая практика для простого и быстрого поиска дубликатов.

Ответ №6:

Пожалуйста, проверьте это один раз …. в 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