Dubbele waarde zoeken afhankelijk van meerdere kolommen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Wouter Horst

Wouter Horst

26/09/2019 08:32:32
Quote Anchor link
Beste Forumleden,

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?
 
PHP hulp

PHP hulp

22/12/2024 17:30:00
 
Jan R

Jan R

26/09/2019 08:54:18
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
SELECT distinct Kolom1, Kolom2, Kolom3, Kolom4
FROM table

of
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SELECT Min(Id) id, Kolom1, Kolom2, Kolom3, Kolom4
FROM table
GROUP BY Kolom1, Kolom2, Kolom3, Kolom4
Gewijzigd op 26/09/2019 09:02:15 door Jan R
 
Aad B

Aad B

26/09/2019 10:22:32
Quote Anchor link
Moet je een fout herstellen, de dubbele waarden alsnog eruit halen of bouw je nieuwe functionaliteit die dit moet voorkomen? In het tweede geval, je wilt een MERGE doen en de dubbeling moet geweigerd worden: Plaats een unique index op de gewenste gecombineerde kolommen en je probleem is opgelost.
Gewijzigd op 26/09/2019 10:26:09 door Aad B
 
Frank Nietbelangrijk

Frank Nietbelangrijk

26/09/2019 19:18:44
Quote Anchor link
Kun je niet beter een Unique constraint op deze kolommen zetten?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
ALTER TABLE merg ADD CONSTRAINT UCmerg UNIQUE (Kolom1,Kolom2,Kolom3);
 
Wouter Horst

Wouter Horst

26/09/2019 20:37:55
Quote Anchor link
Bedankt allemaal,

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.

Afbeelding

Iemand een goede oplossing?
Gewijzigd op 26/09/2019 21:08:28 door Wouter Horst
 
Thomas van den Heuvel

Thomas van den Heuvel

26/09/2019 23:27:17
Quote Anchor link
Uhm. Je import intelligenter maken? :p

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 dubbele waarden je nu eigenlijk hebt waarden meerdere keren voorkomen.

Daarvoor zou je zoiets kunnen doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT <kolom_uniek>, COUNT(<kolom_uniek>) AS aantal
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
 
Wouter Horst

Wouter Horst

27/09/2019 11:16:28
Quote Anchor link
Beste Thomas,

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
)

Afbeelding
Gewijzigd op 27/09/2019 19:13:22 door Wouter Horst
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.