une - éviter les doublons sql




Trouver des valeurs en double dans une table SQL (16)

Il est facile de trouver des duplicates avec un seul champ:

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

Donc, si nous avons une table

ID   NAME   EMAIL
1    John   [email protected]
2    Sam    [email protected]
3    Tom    [email protected]
4    Bob    [email protected]
5    Tom    [email protected]

Cette requête nous donnera John, Sam, Tom, Tom parce qu'ils ont tous le même email .

Cependant, ce que je veux, c'est obtenir des doublons avec le même email et le même name .

C'est, je veux obtenir "Tom", "Tom".

La raison pour laquelle j'ai besoin de ceci: j'ai fait une erreur, et permis d'insérer le name double et les valeurs d' email . Maintenant, j'ai besoin de supprimer / modifier les doublons, donc j'ai besoin de les trouver en premier.


C'est la chose facile que j'ai imaginée. Il utilise une expression de table commune (CTE) et une fenêtre de partition (je pense que ces fonctionnalités sont dans SQL 2008 et versions ultérieures).

Cet exemple trouve tous les étudiants avec un nom en double et dob. Les champs que vous voulez vérifier pour la duplication vont dans la clause OVER. Vous pouvez inclure tous les autres champs que vous voulez dans la projection.

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

Ceci sélectionne / supprime tous les enregistrements en double sauf un enregistrement de chaque groupe de doublons. Ainsi, la suppression laisse tous les enregistrements uniques + un enregistrement de chaque groupe des doublons.

Sélectionnez les doublons:

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

Supprimer les doublons:

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

Soyez conscient des quantités plus importantes d'enregistrements, cela peut entraîner des problèmes de performances.


Comment pouvons-nous compter les valeurs dupliquées ?? soit il est répété 2 fois ou plus que 2. il suffit de les compter, pas de groupe.

aussi simple que

select COUNT(distinct col_01) from Table_01

Dans le cas où vous travaillez avec Oracle, ce serait préférable:

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);

Essayez ce qui suit:

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

Si vous souhaitez voir s'il y a des lignes dupliquées dans votre tableau, j'ai utilisé ci-dessous Requête:

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 

Si vous voulez trouver des données en double (par un ou plusieurs critères) et sélectionnez les lignes réelles.

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/


Un peu en retard à la fête, mais j'ai trouvé une solution de rechange vraiment cool pour trouver tous les ID en double:

SELECT GROUP_CONCAT( id )
FROM users
GROUP BY email
HAVING ( COUNT(email) > 1 )

essayez ce code

WITH CTE AS

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

SELECT column_name,COUNT(*) FROM TABLE_NAME GROUP BY column1, HAVING COUNT(*) > 1;


En utilisant CTE, nous pouvons également trouver une valeur en double comme celle-ci

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

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

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

Simplement grouper sur les deux colonnes.

Remarque: la norme ANSI doit avoir toutes les colonnes non agrégées dans GROUP BY. MySQL vous permet d'éviter cela, mais les résultats sont imprévisibles:

En MySQL, vous avez besoin de sql_mode=only_full_group_by


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




duplicates