sql >> Databasteknik >  >> RDS >> Sqlserver

Ta bort dubbletter från visningen

Du måste ha dubblettposter för vissa/alla klagomålsnummer, så använd DISTINCT kommer inte att fungera. Tänk på en enkel tabell som

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

Om du bara vill ha en post för Kolumn1 =A, har SQL inget sätt att veta om du ska lägga X eller Y i Kolumn2. Det här är samma problem som du har men med 19 kolumner, inte 2. Du måste implementera någon form av logik för hur du bestämmer vilken rad som ska visas för varje klagomålsnummer. Så för tabellen ovan om jag ville att X skulle visas i kolumn2 skulle jag använda följande fråga:

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

Här använder jag ROW_NUMBER() funktion för att prioritera varje rad och sedan bara visa den med högst prioritet. Om jag inte brydde mig om vilken ordning de kom ut i skulle jag kunna använda något sådant här för att välja en slumpmässig rad.

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

Eftersom jag inte vet vilken logik jag ska tillämpa på din fråga kan jag inte lägga upp exakt det du behöver, men jag kan försöka komma igång:

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 skulle bara behöva pilla runt med ORDER BY inom ROW_NUMBER funktion för att passa dina behov.



  1. Hur släpper eller skapar jag en databas från clojure.java.jdbc?

  2. Hur man hanterar skottsekunder i Oracle

  3. Beräkna tidsskillnaden i minuter i SQL Server

  4. Oracle 10 optimizer från REGEL till COST:varför?