Поиск повторяющихся значений в таблице SQL - PullRequest
1675 голосов
/ 07 апреля 2010

Легко найти duplicates с одним полем:

SELECT name, COUNT(email) 
FROM users
GROUP BY email
HAVING COUNT(email) > 1

Так что, если у нас есть таблица

ID   NAME   EMAIL
1    John   asd@asd.com
2    Sam    asd@asd.com
3    Tom    asd@asd.com
4    Bob    bob@asd.com
5    Tom    asd@asd.com

Этот запрос даст нам Джон, Сэм,Том, Том , потому что все они имеют один и тот же email.

Однако, я хочу получить дубликаты с одинаковыми email и name.

То естьЯ хочу получить "Том", "Том".

Причина, по которой мне это нужно: я допустил ошибку и позволил вставить дубликаты name и email.Теперь мне нужно удалить / изменить дубликаты, поэтому мне нужно найти их в первую очередь.

Ответы [ 28 ]

8 голосов
/ 12 сентября 2016
select id,name,COUNT(*) from India group by Id,Name having COUNT(*)>1
7 голосов
/ 26 сентября 2016

Используя CTE, мы также можем найти повторяющиеся значения, подобные этому

with MyCTE
as
(
select Name,EmailId,ROW_NUMBER() over(PARTITION BY EmailId order by id) as Duplicate from [Employees]

)
select * from MyCTE where Duplicate>1
7 голосов
/ 01 июля 2016

Это легкая вещь, которую я придумал. Он использует общее табличное выражение (CTE) и окно раздела (я думаю, что эти функции есть в SQL 2008 и более поздних версиях).

Этот пример находит всех учеников с одинаковыми именами и документами. Поля, которые вы хотите проверить на дублирование, идут в предложении OVER. Вы можете включить любые другие поля, которые вы хотите в проекции.

with cte (StudentId, Fname, LName, DOB, RowCnt)
as (
SELECT StudentId, FirstName, LastName, DateOfBirth as DOB, SUM(1) OVER (Partition By FirstName, LastName, DateOfBirth) as RowCnt
FROM tblStudent
)
SELECT * from CTE where RowCnt > 1
ORDER BY DOB, LName
7 голосов
/ 26 августа 2014

Если вы хотите увидеть, есть ли в вашей таблице повторяющиеся строки, я использовал ниже Запрос:

create table my_table(id int, name varchar(100), email varchar(100));

insert into my_table values (1, 'shekh', 'shekh@rms.com');
insert into my_table values (1, 'shekh', 'shekh@rms.com');
insert into my_table values (2, 'Aman', 'aman@rms.com');
insert into my_table values (3, 'Tom', 'tom@rms.com');
insert into my_table values (4, 'Raj', 'raj@rms.com');


Select COUNT(1) As Total_Rows from my_table 
Select Count(1) As Distinct_Rows from ( Select Distinct * from my_table) abc 
7 голосов
/ 11 декабря 2014

Как мы можем посчитать дублированные значения ??или это повторяется 2 раза или больше, чем 2. просто считайте их, а не по группам.

так же просто, как

select COUNT(distinct col_01) from Table_01
6 голосов
/ 08 сентября 2016
select name, email
, case 
when ROW_NUMBER () over (partition by name, email order by name) > 1 then 'Yes'
else 'No'
end "duplicated ?"
from users
6 голосов
/ 15 октября 2014
 select emp.ename, emp.empno, dept.loc 
          from emp
 inner join dept 
          on dept.deptno=emp.deptno
 inner join
    (select ename, count(*) from
    emp
    group by ename, deptno
    having count(*) > 1)
 t on emp.ename=t.ename order by emp.ename
/
6 голосов
/ 08 мая 2015

SELECT id, COUNT(id) FROM table1 GROUP BY id HAVING COUNT(id)>1;

Я думаю, это будет работать правильно для поиска повторяющихся значений в определенном столбце.

5 голосов
/ 15 апреля 2016

Это также должно сработать, возможно, попробуйте.

  Select * from Users a
            where EXISTS (Select * from Users b 
                where (     a.name = b.name 
                        OR  a.email = b.email)
                     and a.ID != b.id)

Особенно хорошо в вашем случае, если вы ищете дубликаты, которые имеют какой-то префикс или общие изменения, например, новый домен в почте.тогда вы можете использовать replace () в этих столбцах

4 голосов
/ 01 января 2015

Если вы хотите найти дубликаты данных (по одному или нескольким критериям) и выбрать фактические строки.

with MYCTE as (
    SELECT DuplicateKey1
        ,DuplicateKey2 --optional
        ,count(*) X
    FROM MyTable
    group by DuplicateKey1, DuplicateKey2
    having count(*) > 1
) 
SELECT E.*
FROM MyTable E
JOIN MYCTE cte
ON E.DuplicateKey1=cte.DuplicateKey1
    AND E.DuplicateKey2=cte.DuplicateKey2
ORDER BY E.DuplicateKey1, E.DuplicateKey2, CreatedAt

http://developer.azurewebsites.net/2014/09/better-sql-group-by-find-duplicate-data/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...