Suchen Sie doppelte Datensätze in einer Tabelle mit SQL Server
Ich bin die Validierung einer Tabelle ist, die ein transaction-level-Daten von einem E-Commerce-Website und finden Sie den genauen Fehler.
Ich will Ihr helfen, finden doppelte Datensätze in einer 50-Spalte der Tabelle auf SQL-Server.
Nehme an, meine Daten:
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 benutze den untenstehenden Abfrage:
Select shoppername,count(*) as cnt
from dbo.sales
having count(*) > 1
group by shoppername
zurückkehren wird mich
Sam 2
John 2
Aber ich nicht wollen, Duplikate finden, nur über 1 oder 2 Spalten. Ich möchte zu finden, das doppelte für alle Spalten zusammen in meine Daten. Ich will das Ergebnis:
1 Sam 10 A Iphone
InformationsquelleAutor der Frage Matthew | 2012-03-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
können Sie Duplikate entfernen durch ersetzen der select-Anweisung
InformationsquelleAutor der Antwort Sathya Narayanan
InformationsquelleAutor der Antwort Eugene
InformationsquelleAutor der Antwort MUEKSH KUMAR
Fügen Sie einfach alle Felder in die Abfrage und denken Sie daran, fügen Sie Sie zur Gruppe.
InformationsquelleAutor der Antwort GolezTrol
Liste von mehreren Datensätzen den folgenden Befehl verwenden
InformationsquelleAutor der Antwort Abhinav Singh
Versuchen, diese stattdessen
Lesen Sie über die PRÜFSUMME Funktion zuerst, wie kann es Duplikate.
InformationsquelleAutor der Antwort wqw
InformationsquelleAutor der Antwort user5758159
Erstens, ich bezweifle, dass das Ergebnis nicht korrekt ist? Scheinen, wie es gibt Drei 'Sam' aus der ursprünglichen Tabelle. Aber es ist nicht wichtig, die Frage zu stellen.
Dann hier kommen wir zur Frage selbst. Basierend auf Ihrem Tisch, der beste Weg, um zu zeigen doppelte Wert ist zu verwenden
count(*)
undGroup by
- Klausel. Die Abfrage würde wie folgt AussehenSELECT 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 zusammen aus Ihrer Tabelle eindeutig identifiziert jeden Datensatz, was bedeutet, dass die Datensätze als Duplikate nur, wenn alle Werte aus jeder Spalte sind genau die gleichen, auch die, die Sie wollen, um alle Felder auf doppelte Einträge, so dass die
group by
verpassen keine Spalte, sonst ja da kann man nurselect
Spalten, die Teil der 'group by' - Klausel.Nun würde ich gerne geben Sie ein beliebiges Beispiel für
With...Row_Number()Over(...)
, die mit dem Tabellen-Ausdruck zusammen mit der Row_Number-Funktion.Angenommen, Sie haben einen fast gleichen Tabelle, aber mit einer zusätzlichen Spalte " Versanddatum, und der Wert kann sich noch ändern, der rest sind die gleichen. 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 ist nicht doppelt, wenn Sie noch alle Spalten als eine Einheit. Aber was, wenn Sie wollen, behandeln Sie als Duplikat auch in diesem Fall? Sollten Sie verwenden
With...Row_Number()Over(...)
, und die Abfrage würde wie folgt 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'
Den oben genannten Abfrage erhalten das Ergebnis zusammen mit dem Tag der Lieferung, zum Beispiel:
OrderNo shoppername amountpayed city Item Shipping Date Identifier
1 Sam 10 A Iphone 2016-02-02 2
Hinweis: dies ist anders als die mit 2016-01-01, und der Grund, warum 2016-02-02 herausgefiltert wurde, ist
PARTITION BY OrderNo, shoppername, amountPayed, city, item ORDER BY [Shipping Date] as Identifier
und Versand Datum ist NICHT einer der Säulen werden müssen, sorgte für doppelte Einträge, was bedeutet, das man mit 2016-02-02 noch, könnte ein perfektes Ergebnis für Ihre Frage.Nun zusammenfassen, es wenig, mit
count(*)
undGroup by
- Klausel zusammen ist die beste Wahl, wenn Sie nur wollen, um alle Spalten einblenden vonGroup by
Klausel als Ergebnis, sonst werden Sie verpassen die Spalten, die nicht an dergroup by
.Während Für
With...Row_Number()Over(...)
ist, eignet es sich in jedem Szenario, das Sie suchen möchten doppelte Einträge, aber es ist etwas kompliziert zu schreiben, die Abfrage und wenig entwickelt im Vergleich zu den vorigen., Wenn Ihr Zweck ist, zu löschen Sie doppelte Datensätze aus der Tabelle, die Sie verwenden müssen, die später
WITH...ROW_NUMBER()OVER(...)...DELETE FROM...WHERE
.Hoffe, das hilft!
InformationsquelleAutor der Antwort LONG
Versuchen, diese
InformationsquelleAutor der Antwort Rgavendhran N
Können Sie die unten Methoden zu finden, die Ausgabe
InformationsquelleAutor der Antwort sampath acharya
Select *
von dbo.Vertrieb
Gruppe von shoppername
having(count(Element) > 1)
InformationsquelleAutor der Antwort Mahaveer
Select EventID,count() cnt
von dbo.EventInstances
group by EventID"
having count() > 1
InformationsquelleAutor der Antwort user5784803
Den folgenden code:
InformationsquelleAutor der Antwort Pushpendra Singh