sql >> Database teknologi >  >> RDS >> Sqlserver

Fjern dubletter fra visning

Du skal have duplikerede poster for nogle/alle klagenumre, så brug DISTINCT vil ikke virke. Overvej en simpel tabel såsom

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

Hvis du kun vil have én post for Kolonne1 =A, har SQL ingen mulighed for at vide, om du skal sætte X eller Y i Kolonne2. Dette er det samme problem, som du har, men med 19 kolonner, ikke 2. Du skal implementere en form for logik for, hvordan du beslutter, hvilken række der skal vises for hvert klagenummer. Så til ovenstående tabel, hvis jeg ønskede, at X skulle vises i kolonne 2, ville jeg bruge følgende forespørgsel:

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

Her bruger jeg ROW_NUMBER() funktion til at prioritere hver række og derefter kun vise den med højeste prioritet. Hvis jeg var ligeglad med, hvilken rækkefølge de kom ud i, kunne jeg bruge sådan noget til at vælge en tilfældig række.

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

Da jeg ikke ved, hvilken logik jeg skal anvende på din forespørgsel, kan jeg ikke skrive præcis det, du har brug for, men jeg kan prøve at få dig i gang:

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

Du skal bare rode rundt med ORDER BY inden for ROW_NUMBER funktion, der passer til dine behov.



  1. Sådan får du tidligere værdi for null-værdier

  2. Hvornår skal jeg bruge en tabelvariabel vs midlertidig tabel i sql-serveren?

  3. hvordan man beregner intervaller i oracle

  4. Tjek om tabellen arver fra en anden tabel i PostgreSQL