it-swarm.com.de

Suchen Sie mit SQL Server nach doppelten Datensätzen in einer Tabelle

Ich überprüfe eine Tabelle, die Daten einer Transaktionsebene einer E-Commerce-Site enthält, und finde die genauen Fehler.

Ich möchte Ihre Hilfe, um doppelte Datensätze in einer Tabelle mit 50 Spalten auf SQL Server zu finden.

Angenommen, meine Daten sind:

OrderNo shoppername amountpayed city Item       
1       Sam         10          A    Iphone
1       Sam         10          A    Iphone--->>Duplication to be detected
1       Sam         5           A    iPod
2       John        20          B    Macbook
3       John        25          B    Macbookair
4       Jack        5           A    iPod

Angenommen, ich verwende die folgende Abfrage:

Select shoppername,count(*) as cnt
from dbo.sales
having count(*) > 1
group by shoppername

wird mich zurückbringen 

Sam  2
John 2

Ich möchte jedoch nur ein oder zwei Spalten doppelt finden. Ich möchte das Duplikat über alle Spalten hinweg in meinen Daten finden. Ich möchte das Ergebnis als:

1       Sam         10          A    Iphone
38
Sahil
with x as   (select  *,rn = row_number()
            over(PARTITION BY OrderNo,item  order by OrderNo)
            from    #temp1)

select * from x
where rn > 1

sie können Duplikate entfernen, indem Sie select-Anweisung durch ersetzen 

delete x where rn > 1
62
SELECT OrderNo, shoppername, amountPayed, city, item, count(*) as cnt
FROM dbo.sales
GROUP BY OrderNo, shoppername, amountPayed, city, item
HAVING COUNT(*) > 1
39
Eugene
SQL> SELECT JOB,COUNT(JOB) FROM EMP GROUP BY JOB;

JOB       COUNT(JOB)
--------- ----------
ANALYST            2
CLERK              4
MANAGER            3
PRESIDENT          1
SALESMAN           4
4
MUEKSH KUMAR

Fügen Sie einfach alle Felder zur Abfrage hinzu und vergessen Sie nicht, sie auch zu Group By hinzuzufügen.

Select shoppername, a, b, amountpayed, item, count(*) as cnt
from dbo.sales
group by shoppername, a, b, amountpayed, item
having count(*) > 1
3
GolezTrol

Um die Liste mit mehreren Datensätzen abzurufen, verwenden Sie den folgenden Befehl

select field1,field2,field3, count(*)
  from table_name
  group by field1,field2,field3
  having count(*) > 1
3
Abhinav Singh

Versuchen Sie es stattdessen

SELECT MAX(shoppername), COUNT(*) AS cnt
FROM dbo.sales
GROUP BY CHECKSUM(*)
HAVING COUNT(*) > 1

Lesen Sie zuerst die Funktion CHECKSUMME , da Duplikate vorhanden sein können.

1
wqw

Sie können die folgenden Methoden verwenden, um die Ausgabe zu finden

 with Ctec AS
 (
select *,Row_number() over(partition by name order by Name)Rnk
 from Table_A
)
select  Name from ctec
where rnk>1

select name from Table_A
 group by name
 having count(*)>1
0
sampath acharya
with x as (
select shoppername,count(shoppername)
              from sales
              having count(shoppername)>1
            group by shoppername)
select t.* from x,win_gp_pin1510 t
where x.shoppername=t.shoppername
order by t.shoppername
0
user5758159

Versuche dies

with T1 AS
(
SELECT LASTNAME, COUNT(1) AS 'COUNT' FROM Employees GROUP BY LastName HAVING  COUNT(1) > 1
)
SELECT E.*,T1.[COUNT] FROM Employees E INNER JOIN T1 ON T1.LastName = E.LastName
0
Rgavendhran N

Zunächst bezweifle ich, dass das Ergebnis nicht genau ist? Es scheint, als gäbe es drei "Sam" vom Originaltisch. Aber es ist nicht kritisch für die Frage.

Dann kommen wir zur eigentlichen Frage. Basierend auf Ihrer Tabelle können Sie doppelte Werte am besten mit den Klauseln count(*) und Group by anzeigen. Die Abfrage würde so aussehen

SELECT OrderNo, shoppername, amountPayed, city, item, count(*) as RepeatTimes FROM dbo.sales GROUP BY OrderNo, shoppername, amountPayed, city, item HAVING COUNT(*) > 1

Der Grund dafür ist, dass alle Spalten aus Ihrer Tabelle jeden Datensatz eindeutig identifiziert haben, was bedeutet, dass die Datensätze nur dann als doppelt betrachtet werden, wenn alle Werte aus jeder Spalte genau gleich sind. Außerdem möchten Sie alle Felder für doppelte Datensätze anzeigen, sodass der group by wird keine Spalte verpassen, sonst ja, weil Sie nur select Spalten können, die an der 'group by'-Klausel teilnehmen.

Jetzt möchte ich Ihnen ein Beispiel für With...Row_Number()Over(...) geben, das den Tabellenausdruck zusammen mit der Funktion Row_Number verwendet.

Angenommen, Sie haben fast dieselbe Tabelle, aber mit einer zusätzlichen Spalte namens Versanddatum, und der Wert kann sich ändern, auch wenn der Rest der gleiche ist. Hier ist es:

OrderNo shoppername amountpayed city Item Shipping Date
1 Sam 10 A Iphone 2016-01-01 1 Sam 10 A Iphone 2016-02-02 1 Sam 5 A iPod 2016-03-03 2 John 20 B Macbook 2016-04-04 3 John 25 B Macbookair 2016-05-05 4 Jack 5 A iPod 2016-06-06

Beachten Sie, dass Zeile 2 kein Duplikat ist, wenn Sie immer noch alle Spalten als Einheit verwenden. Aber was ist, wenn Sie sie auch in diesem Fall als Duplikat behandeln möchten? Sie sollten With...Row_Number()Over(...) verwenden, und die Abfrage würde folgendermaßen aussehen:

WITH TABLEEXPRESSION AS (SELECT *,ROW_NUMBER() OVER (PARTITION BY OrderNo, shoppername, amountPayed, city, item ORDER BY [Shipping Date] as Identifier) --if you consider the one with late shipping date as the duplicate FROM dbo.sales) SELECT * FROM TABLEEXPRESSION WHERE Identifier !=1 --or use '>1'

Die obige Abfrage gibt das Ergebnis zusammen mit dem Versanddatum aus, zum Beispiel:

OrderNo shoppername amountpayed city Item Shipping Date Identifier 1 Sam 10 A Iphone 2016-02-02 2

Beachten Sie, dass sich dieser Eintrag von dem mit dem 01.01.2016 unterscheidet und der Grund, warum der 02.02.2016 herausgefiltert wurde, PARTITION BY OrderNo, shoppername, amountPayed, city, item ORDER BY [Shipping Date] as Identifier ist und das Versanddatum NICHT zu den Spalten gehört, die für doppelte Datensätze berücksichtigt werden müssen , was bedeutet, dass das mit 2016-02-02 immer noch ein perfektes Ergebnis für Ihre Frage sein könnte.

Fassen Sie es jetzt ein wenig zusammen, indem Sie count(*) und Group by zusammen verwenden. Dies ist die beste Wahl, wenn Sie nur alle Spalten von Group byclause als Ergebnis anzeigen möchten, da Sie sonst die Spalten verpassen, die nicht an group by teilnehmen.

Während es für With...Row_Number()Over(...) in jedem Szenario geeignet ist, doppelte Datensätze zu finden, ist es etwas kompliziert, die Abfrage zu schreiben, und im Vergleich zu der vorherigen ein wenig überarbeitet.

Wenn Sie doppelte Datensätze aus der Tabelle löschen möchten, müssen Sie die spätere Funktion WITH...ROW_NUMBER()OVER(...)...DELETE FROM...WHERE verwenden.

Hoffe das hilft!

0
LONG