Dubbele waarde zoeken afhankelijk van meerdere kolommen
Voor mij MERG table mogen er geen dubbele waarde voorkomen.
Nu zoek ik een query die uit een selectie van twee kolommen uit de derde kolom de controleert of er een dubbele waarde zit.
Opbouw table:
Id, Kolom1, Kolom2, Kolom3, Value
1, waarde1, waarde2, waarde3, 1234
2, waarde1, waarde2, waarde5, 1231
3, waarde2, waarde2, waarde6, 2134
4, waarde2, waarde2, waarde6, 2134
5, waarde2, waarde3, waarde5, 3214
Bij record 3 en 4 zie je dat kolom 1, 2 en 3 gelijk zijn dat kan dus niet.
Wij kan mij helpen?
of
Code (php)
1
2
3
2
3
SELECT Min(Id) id, Kolom1, Kolom2, Kolom3, Kolom4
FROM table
GROUP BY Kolom1, Kolom2, Kolom3, Kolom4
FROM table
GROUP BY Kolom1, Kolom2, Kolom3, Kolom4
Gewijzigd op 26/09/2019 09:02:15 door Jan R
Gewijzigd op 26/09/2019 10:26:09 door Aad B
Het gaat nu echt om opschonen van de tabel.
SELECT Id, Ean, Channel, Timestamp, ReadingN
FROM src.Values2 order by Ean, Channel, Timestamp
Met deze query krijg ik alle dubbelen onder elkaar te zien.
Nu wil ik alleen de eerste record steeds verwijderen zodat alle dubbelen eruit zijn.
Iemand een goede oplossing?
Gewijzigd op 26/09/2019 21:08:28 door Wouter Horst
But seriously. Het ziet er naar uit dat de id's boven de ~5600 de mist in gaan? Je wilt misschien ook wat analyse doen om een oorzaak vast te stellen en dit in de toekomst te voorkomen. Of is dit al bekend?
En kun je alle oude versies van dubbele records zomaar verwijderen? En weet je zeker dat deze er enkel dubbel in staan, en niet driedubbel of wat dan ook?
Misschien wil je eerst een overzicht hebben van welke
Daarvoor zou je zoiets kunnen doen:
Code (php)
1
2
3
4
2
3
4
SELECT <kolom_uniek>, COUNT(<kolom_uniek>) AS aantal
FROM <tabel>
GROUP BY <kolom_uniek>
HAVING aantal > 1
FROM <tabel>
GROUP BY <kolom_uniek>
HAVING aantal > 1
Dit levert je een lijst van duplicaten en hoeveel dit er zijn. Dit zou je vervolgens als uitgangspunt kunnen gebruiken om specifieke duplicaten te verwijderen.
Idealiter maak je hier een soort van ontdubbelingsscript van, met een bepaalde strategie (alle laagste of hoogste id's behouden ofzo). Uiteraard zet je dit alles in een soort van database-transactie zodat al deze bewerkingen in één ondeelbare actie plaatsvinden.
Het zou natuurlijk beter zijn om duplicaten te voorkomen maar als dat op een of andere manier niet mogelijk is of niet makkelijk is, dan heb je in ieder geval iets op de plank liggen waarmee je dit in één keer plat kunt slaan.
Gewijzigd op 26/09/2019 23:31:11 door Thomas van den Heuvel
De data wordt via een REST API binnen gehaald naar een src table.
Kolom 2, 3, en 4 kunnen alle dubbele waarde hebben. Echter kunnen ze niet alle drie tegelijk de zelfde waarde hebben.
Het zijn meters die per uur uitgelezen worden.
Normaal wordt na het uitlezen van de REST API de table met MERGE weggeschreven in de productie table.(Nieuwe records toegevoegd en bestaande geupdate) En dan met TRUNCATE de scr table leeggemaakt.
Maar omdat er bij MERGE geen dubbelingen mogen plaatsvinden loopt het hierop stuk.
Wat ik dus zoekt was is een procedure/query om de dubbelen te verwijderen waar kolom 1, 2, en 3 gelijk aan elkaar zijn. (Deze procedure zou ik dan nog voor de MERGE kunnen uitvoeren)
Hieronder heb ik iets geprobeerd en het werkt!
DELETE FROM src.Values2 WHERE ID in
(
SELECT MAX(Id) FROM src.Values2 GROUP BY Ean, Channel, TimeStamp HAVING COUNT(*)>1
)
Gewijzigd op 27/09/2019 19:13:22 door Wouter Horst