Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Entfernen Sie doppelte Datensätze aus der Ansicht

Sie müssen für einige/alle Beschwerdenummern doppelte Datensätze haben, verwenden Sie also DISTINCT wird nicht funktionieren. Stellen Sie sich eine einfache Tabelle wie

vor
Column1    |    Column2
-----------+------------
A          |    X
A          |    Y

Wenn Sie nur einen Datensatz für Spalte1 =A wünschen, kann SQL nicht wissen, ob X oder Y in Spalte2 eingefügt werden soll. Dies ist das gleiche Problem, das Sie haben, aber mit 19 Spalten, nicht 2. Sie müssen eine Art Logik implementieren, um zu entscheiden, welche Zeile für jede Beschwerdenummer angezeigt wird. Wenn ich also für die obige Tabelle wollte, dass X in Column2 angezeigt wird, würde ich die folgende Abfrage verwenden:

SELECT  Column1,
        Column2
FROM    (   SELECT  Column1,
                    Column2,
                    ROW_NUMBER() OVER(PARTITION BY Column1 ORDER BY Column2 ASC) [RowNumber]
            FROM    MyTable
        ) t
WHERE   RowNumber = 1

Hier verwende ich die ROW_NUMBER() Funktion, um jede Zeile zu priorisieren und dann nur die mit der höchsten Priorität anzuzeigen. Wenn es mir egal wäre, in welcher Reihenfolge sie herauskommen, könnte ich so etwas verwenden, um eine zufällige Reihe auszuwählen.

ROW_NUMBER() OVER(PARTITION BY Column1 ORDER BY NEWID()) [RowNumber]

Da ich nicht weiß, welche Logik ich auf Ihre Anfrage anwenden soll, kann ich nicht genau posten, was Sie brauchen, aber ich kann versuchen, Ihnen den Einstieg zu erleichtern:

SELECT  [Complaint Number],
        [Complaint_For],
        [Total_Complaint_Qty],
        [Defects],
        [Customer Code ],
        [Location],
        [CutomerName],
        [KUNUM],
        [QMNUM],
        [Responsible_KAM]
FROM    (   SELECT  [Complaint Number],
                    [Complaint_For],
                    [Total_Complaint_Qty],
                    [Defects],
                    [Customer Code ],
                    [Location],
                    [CutomerName],
                    [KUNUM],
                    [QMNUM],
                    [Responsible_KAM],
                    ROW_NUMBER() OVER(PARTITION BY [Complaint Number] ORDER BY Complaint_For, Defects) AS RowNumber
            FROM    [CCCMPREPOSITORY].[dbo].[VW_Final_]
        ) data
WHERE   RowNumber = 1

Sie müssten nur mit ORDER BY herumspielen innerhalb der ROW_NUMBER Funktion an Ihre Bedürfnisse anpassen.