Essayez ceci :
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
SORTIE :
name email CountOf
---------- ----------- -----------
John John-email 2
sam sam-email 2
(2 row(s) affected)
si vous voulez les ID des dups, utilisez ceci :
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
SORTIE :
id name email
----------- ---------- ------------
1 John John-email
2 John John-email
5 sam sam-email
6 sam sam-email
(4 row(s) affected)
pour essayer de supprimer les doublons :
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
SORTIE :
id name email
----------- ---------- --------------
1 John John-email
3 fred John-email
4 fred fred-email
5 sam sam-email
(4 row(s) affected)
35 votes
Je ne pense pas qu'il vous laisserait sélectionner le nom dans votre premier échantillon puisqu'il n'est pas dans une fonction d'agrégation. "Quel est le nombre d'adresses électroniques et de noms correspondants" est une logique délicate...
4 votes
J'ai découvert que cela ne fonctionne pas avec le serveur MSSQL à cause de la
name
dans le champ SELECT.0 votes
Ce dont j'ai besoin, c'est l'identifiant des enregistrements dont l'email est dupliqué.
0 votes
J'étais sur le point de trouver mes propres données en double donc ceci a fonctionné pour moi (en PHP faire : if ($record['DuplicatesCount'] > 1)) : "SELECT barcode, COUNT(*) AS DuplicatesCount FROM [main1].[dbo].[bayan_product] GROUP BY barcode"