sql >> Databáze >  >> RDS >> Sqlserver

Odebrat duplicitní záznamy ze zobrazení

Musíte mít duplicitní záznamy pro některá/všechna čísla stížností, takže pomocí DISTINCT to nebude fungovat. Zvažte jednoduchou tabulku, jako je

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

Pokud chcete pouze jeden záznam pro Sloupec1 =A, SQL nemá žádný způsob, jak zjistit, zda vložit X nebo Y do Sloupec2. Toto je stejný problém jako vy, ale s 19 sloupci, nikoli 2. Musíte implementovat nějakou logiku, jak rozhodnout, který řádek se zobrazí pro každé číslo stížnosti. Takže pro výše uvedenou tabulku, pokud bych chtěl, aby se X zobrazovalo ve sloupci2, použil bych následující dotaz:

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

Zde používám ROW_NUMBER() funkci upřednostnit každý řádek a poté zobrazit pouze ten s nejvyšší prioritou. Kdyby mi bylo jedno, v jakém pořadí vyšly, mohl bych použít něco takového k výběru náhodného řádku.

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

Protože nevím, jakou logiku použít na váš dotaz, nemohu zveřejnit přesně to, co potřebujete, ale mohu se pokusit vás začít:

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

Stačí si pohrát s ORDER BY v rámci ROW_NUMBER funkce podle vašich potřeb.



  1. Jak mohu používat Oracle z .NET?

  2. ORA-12899, zatímco skutečná délka hodnoty je menší než maximální

  3. SELECT INTO v MySQL

  4. Mysql:Programově odstraňte všechny cizí klíče