registros - trazer valores repetidos sql




Encontrando valores duplicados em uma tabela SQL (17)

Caso você trabalhe com a Oracle, desta forma seria preferível:

create table my_users(id number, name varchar2(100), email varchar2(100));

insert into my_users values (1, 'John', '[email protected]');
insert into my_users values (2, 'Sam', '[email protected]');
insert into my_users values (3, 'Tom', '[email protected]');
insert into my_users values (4, 'Bob', '[email protected]');
insert into my_users values (5, 'Tom', '[email protected]');

commit;

select *
  from my_users
 where rowid not in (select min(rowid) from my_users group by name, email);

É fácil encontrar duplicates com um campo:

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

Então, se tivermos uma mesa

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

Esta consulta nos dará John, Sam, Tom, Tom, porque todos eles têm o mesmo email .

No entanto, o que eu quero é obter duplicatas com o mesmo email e name .

Ou seja, eu quero pegar "Tom", "Tom".

A razão pela qual eu preciso disso: cometi um erro e permiti inserir valores duplicados de name e email . Agora preciso remover / alterar as duplicatas, portanto, preciso encontrá- las primeiro.


Como podemos contar os valores duplicados? ou é repetido 2 vezes ou maior que 2. contá-las, não em grupo.

tão simples quanto

select COUNT(distinct col_01) from Table_01

Isso seleciona / exclui todos os registros duplicados, exceto um registro de cada grupo de duplicados. Assim, a exclusão deixa todos os registros únicos + um registro de cada grupo das duplicatas.

Selecione duplicatas:

SELECT *
FROM table
WHERE
    id NOT IN (
        SELECT MIN(id)
        FROM table
        GROUP BY column1, column2
);

Excluir duplicatas:

DELETE FROM table
WHERE
    id NOT IN (
        SELECT MIN(id)
        FROM table
        GROUP BY column1, column2
);

Esteja ciente de grandes quantidades de registros, isso pode causar problemas de desempenho.


Isso também deve funcionar, talvez tentar.

  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)

Especialmente bom no seu caso Se você procurar por duplicatas que tenham algum tipo de prefixo ou mudança geral, como por exemplo, novo domínio no correio. então você pode usar replace () nessas colunas


Se você deseja ver se há linhas duplicadas em sua tabela, usei abaixo de Consulta:

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

insert into my_table values (1, 'shekh', '[email protected]');
insert into my_table values (1, 'shekh', '[email protected]');
insert into my_table values (2, 'Aman', '[email protected]');
insert into my_table values (3, 'Tom', '[email protected]');
insert into my_table values (4, 'Raj', '[email protected]');


Select COUNT(1) As Total_Rows from my_table 
Select Count(1) As Distinct_Rows from ( Select Distinct * from my_table) abc 

Se você quiser encontrar dados duplicados (por um ou vários critérios) e selecione as linhas reais.

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/


Tente isto:

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

Tente o seguinte:

SELECT * FROM
(
    SELECT Id, Name, Age, Comments, Row_Number() OVER(PARTITION BY Name, Age ORDER By Name)
        AS Rank 
        FROM Customers
) AS B WHERE Rank>1

tente este código

WITH CTE AS

( SELECT Id, Name, Age, Comments, RN = ROW_NUMBER()OVER(PARTITION BY Name,Age ORDER BY ccn)
FROM ccnmaster )
select * from CTE 

tente isto:

declare @YourTable table (id int, name varchar(10), email varchar(50))

INSERT @YourTable VALUES (1,'John','John-email')
INSERT @YourTable VALUES (2,'John','John-email')
INSERT @YourTable VALUES (3,'fred','John-email')
INSERT @YourTable VALUES (4,'fred','fred-email')
INSERT @YourTable VALUES (5,'sam','sam-email')
INSERT @YourTable VALUES (6,'sam','sam-email')

SELECT
    name,email, COUNT(*) AS CountOf
    FROM @YourTable
    GROUP BY name,email
    HAVING COUNT(*)>1

SAÍDA:

name       email       CountOf
---------- ----------- -----------
John       John-email  2
sam        sam-email   2

(2 row(s) affected)

Se você quiser que os IDs dos dups usem isto:

SELECT
    y.id,y.name,y.email
    FROM @YourTable y
        INNER JOIN (SELECT
                        name,email, COUNT(*) AS CountOf
                        FROM @YourTable
                        GROUP BY name,email
                        HAVING COUNT(*)>1
                    ) dt ON y.name=dt.name AND y.email=dt.email

SAÍDA:

id          name       email
----------- ---------- ------------
1           John       John-email
2           John       John-email
5           sam        sam-email
6           sam        sam-email

(4 row(s) affected)

para excluir as duplicatas, tente:

DELETE d
    FROM @YourTable d
        INNER JOIN (SELECT
                        y.id,y.name,y.email,ROW_NUMBER() OVER(PARTITION BY y.name,y.email ORDER BY y.name,y.email,y.id) AS RowRank
                        FROM @YourTable y
                            INNER JOIN (SELECT
                                            name,email, COUNT(*) AS CountOf
                                            FROM @YourTable
                                            GROUP BY name,email
                                            HAVING COUNT(*)>1
                                        ) dt ON y.name=dt.name AND y.email=dt.email
                   ) dt2 ON d.id=dt2.id
        WHERE dt2.RowRank!=1
SELECT * FROM @YourTable

SAÍDA:

id          name       email
----------- ---------- --------------
1           John       John-email
3           fred       John-email
4           fred       fred-email
5           sam        sam-email

(4 row(s) affected)

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

Acho que isso funcionará corretamente para pesquisar valores repetidos em uma coluna específica.


Como obter um registro duplicado na tabela

SELECIONAR CONTAGEM (Código), Código de Funcionários WHERE Status = 1 GROUP BY Code HAVING COUNT (Code)> 1


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

Simplesmente agrupe em ambas as colunas.

Nota: o padrão ANSI mais antigo é ter todas as colunas não agregadas no GROUP BY, mas isso mudou com a idéia de "dependência funcional" :

Na teoria de banco de dados relacional, uma dependência funcional é uma restrição entre dois conjuntos de atributos em uma relação de um banco de dados. Em outras palavras, a dependência funcional é uma restrição que descreve o relacionamento entre atributos em uma relação.

O suporte não é consistente:

  • O recente PostgreSQL suporta isso .
  • O SQL Server (como no SQL Server 2017) ainda requer todas as colunas não agregadas no GROUP BY.
  • O MySQL é imprevisível e você precisa de sql_mode=only_full_group_by :
  • O Oracle não é mainstream suficiente (aviso: humor, eu não sei sobre o Oracle).

SELECT
  FirstName, LastName, MobileNo, COUNT(1) as CNT 
FROM        
  CUSTOMER
GROUP BY
  FirstName, LastName, MobileNo 
HAVING
  COUNT(1) > 1;

select id,name,COUNT(*) from India group by Id,Name having COUNT(*)>1

select name, email
, case 
when ROW_NUMBER () over (partition by name, email order by name) > 1 then 'Yes'
else 'No'
end "duplicated ?"
from users

 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
/






duplicates