#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