duplicates
ist mit einem Feld leicht zu finden:
SELECT name, COUNT(email)
FROM users
GROUP BY email
HAVING COUNT(email) > 1
Also, wenn wir einen Tisch haben
ID NAME EMAIL
1 John [email protected]
2 Sam [email protected]
3 Tom [email protected]
4 Bob [email protected]
5 Tom [email protected]
Diese Abfrage gibt uns John, Sam, Tom, Tom, da sie alle dasselbe email
haben.
Ich möchte jedoch Duplikate mit den gleichen email
und name
.
Das heißt, ich möchte "Tom", "Tom" bekommen.
Der Grund, warum ich das brauche: Ich habe einen Fehler gemacht und durfte doppelte name
- und email
-Werte einfügen. Jetzt muss ich entfernen/ändern die Duplikate, also muss ich zuerst finden.
SELECT
name, email, COUNT(*)
FROM
users
GROUP BY
name, email
HAVING
COUNT(*) > 1
Gruppieren Sie einfach beide Spalten.
Hinweis: Der ältere ANSI-Standard soll alle nicht aggregierten Spalten in GROUP BY enthalten, dies hat sich jedoch mit der Vorstellung von "Funktionsabhängigkeit" geändert:
In der Theorie relationaler Datenbanken ist eine funktionale Abhängigkeit eine Einschränkung zwischen zwei Attributsätzen in einer Relation aus einer Datenbank. Mit anderen Worten ist die funktionale Abhängigkeit eine Einschränkung, die die Beziehung zwischen Attributen in einer Beziehung beschreibt.
Support ist nicht konsistent:
sql_mode=only_full_group_by
: versuche dies:
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
AUSGABE:
name email CountOf
---------- ----------- -----------
John John-email 2
sam sam-email 2
(2 row(s) affected)
wenn Sie möchten, dass die IDs der Dups Folgendes verwenden:
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
AUSGABE:
id name email
----------- ---------- ------------
1 John John-email
2 John John-email
5 sam sam-email
6 sam sam-email
(4 row(s) affected)
um die Duplikate zu löschen, versuchen Sie:
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
AUSGABE:
id name email
----------- ---------- --------------
1 John John-email
3 fred John-email
4 fred fred-email
5 sam sam-email
(4 row(s) affected)
Versuche dies:
SELECT name, email
FROM users
GROUP BY name, email
HAVING ( COUNT(*) > 1 )
Wenn Sie die Duplikate löschen möchten, ist dies ein viel einfacherer Weg, als gerade/ungerade Zeilen in einem dreifachen Subselect zu finden:
SELECT id, name, email
FROM users u, users u2
WHERE u.name = u2.name AND u.email = u2.email AND u.id > u2.id
Und so zu löschen:
DELETE FROM users
WHERE id IN (
SELECT id/*, name, email*/
FROM users u, users u2
WHERE u.name = u2.name AND u.email = u2.email AND u.id > u2.id
)
Viel leichter zu lesen und zu verstehen, IMHO
Hinweis: Das einzige Problem ist, dass Sie die Anforderung ausführen müssen, bis keine Zeilen gelöscht werden, da Sie jeweils nur eine Kopie jedes Duplikats löschen
Versuche Folgendes:
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
SELECT name, email
FROM users
WHERE email in
(SELECT email FROM users
GROUP BY email
HAVING COUNT(*)>1)
Etwas spät zur Party, aber ich fand eine wirklich coole Lösung, um alle doppelten IDs zu finden:
SELECT GROUP_CONCAT( id )
FROM users
GROUP BY email
HAVING ( COUNT(email) > 1 )
versuchen Sie diesen 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
Falls Sie mit Oracle arbeiten, ist dieser Weg vorzuziehen:
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);
Dadurch werden alle doppelten Datensätze mit Ausnahme eines Datensatzes aus jeder Gruppe von Duplikaten ausgewählt bzw. gelöscht. Beim Löschen bleiben also alle eindeutigen Datensätze + ein Datensatz aus jeder Gruppe der Duplikate.
Duplikate auswählen:
SELECT *
FROM table
WHERE
id NOT IN (
SELECT MIN(id)
FROM table
GROUP BY column1, column2
);
Duplikate löschen:
DELETE FROM table
WHERE
id NOT IN (
SELECT MIN(id)
FROM table
GROUP BY column1, column2
);
Beachten Sie größere Mengen an Datensätzen, da dies zu Leistungsproblemen führen kann.
select id,name,COUNT(*) from India group by Id,Name having COUNT(*)>1
Wie können wir die doppelten Werte zählen ?? Entweder werden sie zweimal wiederholt oder größer als 2 . Zählen Sie sie einfach, nicht gruppenweise.
so einfach wie
select COUNT(distinct col_01) from Table_01
Dies ist die einfache Sache, die ich mir ausgedacht habe. Es verwendet einen allgemeinen Tabellenausdruck (CTE) und ein Partitionsfenster (ich denke, dass diese Funktionen in SQL 2008 und höher enthalten sind).
In diesem Beispiel werden alle Schüler mit doppeltem Namen und dob gefunden. Die Felder, die Sie auf Duplikate prüfen möchten, werden in die OVER-Klausel übernommen. Sie können beliebige andere Felder in die Projektion aufnehmen.
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
select name, email
, case
when ROW_NUMBER () over (partition by name, email order by name) > 1 then 'Yes'
else 'No'
end "duplicated ?"
from users
Wenn Sie sehen möchten, ob in Ihrer Tabelle doppelte Zeilen vorhanden sind, habe ich unter Abfrage verwendet:
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
SELECT id, COUNT(id) FROM table1 GROUP BY id HAVING COUNT(id)>1;
Ich denke, dass dies richtig funktioniert, um wiederholte Werte in einer bestimmten Spalte zu suchen.
Das sollte auch funktionieren, vielleicht probieren.
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)
Besonders gut in Ihrem Fall Wenn Sie nach Duplikaten suchen, die eine Art Präfix oder allgemeine Änderung wie z. neue Domain in Mail. Dann können Sie replace () in diesen Spalten verwenden
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
/
Durch die Verwendung von CTE können wir auch doppelte Werte finden
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
Wenn Sie doppelte Daten (nach einem oder mehreren Kriterien) suchen und die tatsächlichen Zeilen auswählen möchten.
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/
SELECT * FROM users u where rowid = (select max(rowid) from users u1 where
u.email=u1.email);
SELECT column_name,COUNT(*) FROM TABLE_NAME GROUP BY column1, HAVING COUNT(*) > 1;
So prüfen Sie aus doppeltem Datensatz in einer Tabelle.
select * from users s
where rowid < any
(select rowid from users k where s.name = k.name and s.email = k.email);
oder
select * from users s
where rowid not in
(select max(rowid) from users k where s.name = k.name and s.email = k.email);
So löschen Sie den doppelten Datensatz in einer Tabelle.
delete from users s
where rowid < any
(select rowid from users k where s.name = k.name and s.email = k.email);
oder
delete from users s
where rowid not in
(select max(rowid) from users k where s.name = k.name and s.email = k.email);
Wir können hier verwenden, welche Arbeiten an Aggregatfunktionen wie unten gezeigt
create table #TableB (id_account int, data int, [date] date)
insert into #TableB values (1 ,-50, '10/20/2018'),
(1, 20, '10/09/2018'),
(2 ,-900, '10/01/2018'),
(1 ,20, '09/25/2018'),
(1 ,-100, '08/01/2018')
SELECT id_account , data, COUNT(*)
FROM #TableB
GROUP BY id_account , data
HAVING COUNT(id_account) > 1
drop table #TableB
Hier werden zwei Felder id_account und Daten mit Count (*) verwendet. Es werden also alle Datensätze ausgegeben, die in beiden Spalten mehr als einmal dieselben Werte haben.
Aus irgendeinem Grund hatten wir versehentlich versäumt, Einschränkungen in der SQL Server-Tabelle hinzuzufügen, und die Datensätze wurden in allen Spalten der Front-End-Anwendung doppelt eingefügt. Dann können wir unten Abfrage verwenden, um doppelte Abfrage aus der Tabelle zu löschen.
SELECT DISTINCT * INTO #TemNewTable FROM #OriginalTable
TRUNCATE TABLE #OriginalTable
INSERT INTO #OriginalTable SELECT * FROM #TemNewTable
DROP TABLE #TemNewTable
Hier haben wir alle unterschiedlichen Datensätze der ursprünglichen Tabelle genommen und die Datensätze der ursprünglichen Tabelle gelöscht. Wieder haben wir alle unterschiedlichen Werte aus der neuen Tabelle in die ursprüngliche Tabelle eingefügt und dann die neue Tabelle gelöscht.
Sie können das Schlüsselwort SELECT DISTINCT verwenden, um Duplikate zu entfernen. Sie können auch nach Namen filtern und alle Personen mit diesem Namen in eine Tabelle aufnehmen.
Möglicherweise möchten Sie dies versuchen
SELECT NAME, EMAIL, COUNT(*)
FROM USERS
GROUP BY 1,2
HAVING COUNT(*) > 1
Zum Löschen von Datensätzen mit doppeltem Namen
;WITH CTE AS
(
SELECT ROW_NUMBER() OVER (PARTITION BY name ORDER BY name) AS T FROM @YourTable
)
DELETE FROM CTE WHERE T > 1