sql >> Database >  >> RDS >> Sqlserver

Dubbele records uit weergave verwijderen

U moet dubbele records hebben voor sommige/alle klachtennummers, dus gebruik DISTINCT zal niet werken. Overweeg een eenvoudige tabel zoals

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

Als u slechts één record voor Kolom1 =A wilt, weet SQL niet of X of Y in Kolom2 moet worden geplaatst. Dit is hetzelfde probleem dat u ondervindt, maar met 19 kolommen, niet 2. U moet een soort logica implementeren om te beslissen welke rij voor elk klachtnummer wordt weergegeven. Dus voor de bovenstaande tabel als ik X in Kolom2 wilde laten zien, zou ik de volgende query gebruiken:

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 gebruik ik de ROW_NUMBER() functie om prioriteit te geven aan elke rij en dan alleen de rij met de hoogste prioriteit weer te geven. Als het me niet kon schelen in welke volgorde ze uitkwamen, zou ik zoiets als dit kunnen gebruiken om een ​​willekeurige rij te kiezen.

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

Aangezien ik niet weet welke logica ik moet toepassen op uw vraag, kan ik niet precies posten wat u nodig heeft, maar ik kan proberen u op weg te helpen:

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

Je hoeft alleen maar te rommelen met de ORDER BY binnen de ROW_NUMBER functie om aan uw behoeften te voldoen.



  1. Veroorzaakt PDO::beginTransaction() vergrendeling van tabellen of rijen tot PDO::commit()?

  2. Hoe u een gebruiker kunt maken met superuser-rechten in PostgreSQL

  3. MySQL Atomic UPDATE in InnoDB versus MyISAM

  4. waarde doorgeven in url href in php