Query iets aanpassen

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • NeFoRcE
  • Registratie: Mei 2004
  • Laatst online: 15:37

NeFoRcE

Hallo? Bent u daar?

Topicstarter
Dag,

Ik heb een lange query waarbij als resultaat (vereenvoudigd) dit uit komt:

kolom 1, kolom 2
1, 202401
2, 202402
3, NULL
4, NULL
4, 202405
5, NULL
6, 202402
7, 202402
8, 202404
9, 202407
10, 202408

Ik zou graag willen dat, indien 't resultaat meerdere dezelfde 'kolom 1' bevat, ik daarvan alleen het resultaat teurgkrijg wat niet NULL is, ik zou dus graag willen dat ik dit terug krijg:

kolom 1, kolom 2
1, 202401
2, 202402
3, NULL
4, 202405
5, NULL
6, 202402
7, 202402
8, 202404
9, 202407
10, 202408

Maar, een simpele NOT NULL gaat niet werken, want ik heb meerdere kolommen, waarbij kolom 2 soms wel NULL moet zijn...

PS:
Ik gebruik een oudere versie van MariaDB waarbij zaken als 'WITH' niet werken, bijwerken is voor nu geen optie.

[ Voor 8% gewijzigd door NeFoRcE op 29-01-2024 16:46 ]

Professioneel Heftruck Syndroom

Alle reacties


Acties:
  • 0 Henk 'm!

  • Titu
  • Registratie: Februari 2010
  • Laatst online: 17-07 08:35
Om het gewenste resultaat te bereiken, kun je gebruikmaken van een query met het ROW_NUMBER() vensterfunctie om de rijen te nummeren binnen elke groep van dezelfde waarden in 'kolom 1'. Vervolgens kun je de rijen selecteren waar de waarde in 'kolom 2' niet NULL is, en als er meerdere rijen zijn met dezelfde waarde in 'kolom 1', dan wordt alleen de eerste geselecteerd.

Hier is een voorbeeldquery die dit zou kunnen doen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
WITH GenummerdeRijen AS (
  SELECT
    kolom1,
    kolom2,
    ROW_NUMBER() OVER (PARTITION BY kolom1 ORDER BY kolom2 DESC) AS rijnummer
  FROM
    jouw_tabel
)
SELECT
  kolom1,
  kolom2
FROM
  GenummerdeRijen
WHERE
  (kolom2 IS NOT NULL OR rijnummer = 1);


Vervang jouw_tabel door de daadwerkelijke naam van je tabel. In deze query wordt ROW_NUMBER() gebruikt om de rijen te nummeren binnen elke groep van dezelfde waarden in 'kolom 1', en de rijen worden vervolgens gefilterd op basis van de voorwaarden die je hebt opgegeven.

Merk op dat de ORDER BY kolom2 DESC ervoor zorgt dat als er meerdere rijen zijn met dezelfde waarde in 'kolom 1', de rij met een niet-NULL waarde in 'kolom 2' de hoogste prioriteit krijgt.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 01:20

Janoz

Moderator Devschuur®

!litemod

Kan het ook voorkomen dat kolom 1 vaker voorkomt, maar waarbij kolom 2 wel meerdere keren gevuld is?

Bijvoorbeeld:
1, 202401
2, 202402
2, 202403
3, 202404

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • NeFoRcE
  • Registratie: Mei 2004
  • Laatst online: 15:37

NeFoRcE

Hallo? Bent u daar?

Topicstarter
Titu schreef op maandag 29 januari 2024 @ 16:35:
Om het gewenste resultaat te bereiken, kun je gebruikmaken van een query met het ROW_NUMBER() vensterfunctie om de rijen te nummeren binnen elke groep van dezelfde waarden in 'kolom 1'. Vervolgens kun je de rijen selecteren waar de waarde in 'kolom 2' niet NULL is, en als er meerdere rijen zijn met dezelfde waarde in 'kolom 1', dan wordt alleen de eerste geselecteerd.

Hier is een voorbeeldquery die dit zou kunnen doen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
WITH GenummerdeRijen AS (
  SELECT
    kolom1,
    kolom2,
    ROW_NUMBER() OVER (PARTITION BY kolom1 ORDER BY kolom2 DESC) AS rijnummer
  FROM
    jouw_tabel
)
SELECT
  kolom1,
  kolom2
FROM
  GenummerdeRijen
WHERE
  (kolom2 IS NOT NULL OR rijnummer = 1);


Vervang jouw_tabel door de daadwerkelijke naam van je tabel. In deze query wordt ROW_NUMBER() gebruikt om de rijen te nummeren binnen elke groep van dezelfde waarden in 'kolom 1', en de rijen worden vervolgens gefilterd op basis van de voorwaarden die je hebt opgegeven.

Merk op dat de ORDER BY kolom2 DESC ervoor zorgt dat als er meerdere rijen zijn met dezelfde waarde in 'kolom 1', de rij met een niet-NULL waarde in 'kolom 2' de hoogste prioriteit krijgt.
Dit komt rechtstreeks van ChatGPT, dat heb ik uiteraard al geprobeerd, maar ik gebruik een oudere versie van MariaDB die geen WITH ondersteunt.
Janoz schreef op maandag 29 januari 2024 @ 16:36:
Kan het ook voorkomen dat kolom 1 vaker voorkomt, maar waarbij kolom 2 wel meerdere keren gevuld is?

Bijvoorbeeld:
1, 202401
2, 202402
2, 202403
3, 202404
Nee :)

Professioneel Heftruck Syndroom


Acties:
  • 0 Henk 'm!

  • Josk79
  • Registratie: September 2013
  • Laatst online: 21-07 23:45
NeFoRcE schreef op maandag 29 januari 2024 @ 16:44:

Dit komt rechtstreeks van ChatGPT, dat heb ik uiteraard al geprobeerd, maar ik gebruik een oudere versie van MariaDB die geen WITH ondersteunt.
Dat is best handige informatie om te vertellen, denk je niet?

Acties:
  • 0 Henk 'm!

  • NeFoRcE
  • Registratie: Mei 2004
  • Laatst online: 15:37

NeFoRcE

Hallo? Bent u daar?

Topicstarter
Josk79 schreef op maandag 29 januari 2024 @ 16:45:
[...]


Dat is best handige informatie om te vertellen, denk je niet?
OP aangepast. Maar ligt het aan mij of is je taal best onprettig?

Professioneel Heftruck Syndroom


Acties:
  • 0 Henk 'm!

  • desmond
  • Registratie: Januari 2004
  • Niet online
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- cte weggewerkt 
SELECT
  kolom1,
  kolom2
FROM (
  SELECT
    kolom1,
    kolom2,
    ROW_NUMBER() OVER (PARTITION BY kolom1 ORDER BY kolom2 DESC) AS rijnummer
  FROM
    jouw_tabel
)   GenummerdeRijen
WHERE
  (kolom2 IS NOT NULL OR rijnummer = 1);

Acties:
  • 0 Henk 'm!

  • Josk79
  • Registratie: September 2013
  • Laatst online: 21-07 23:45
NeFoRcE schreef op maandag 29 januari 2024 @ 16:46:
[...]


OP aangepast. Maar ligt het aan mij of is je taal best onprettig?
Ja, ben met verkeerde been uit bed gestapt :D

code:
1
SELECT kolom1, MAX(kolom2) FROM tabel GROUP BY kolom1


Is dit ongeveer wat je wilt?

Acties:
  • 0 Henk 'm!

  • NeFoRcE
  • Registratie: Mei 2004
  • Laatst online: 15:37

NeFoRcE

Hallo? Bent u daar?

Topicstarter
Josk79 schreef op maandag 29 januari 2024 @ 16:53:
[...]


Ja, ben met verkeerde been uit bed gestapt :D

code:
1
SELECT kolom1, MAX(kolom2) FROM tabel GROUP BY kolom1


Is dit ongeveer wat je wilt?
Potverdrie, dit lijkt erop. Zal morgen met een frisse blik m'n dataset even doornemen. Maar eerste indruk lijkt goed. Soms kan het zo simpel zijn...

laat het je weten!

Professioneel Heftruck Syndroom


Acties:
  • 0 Henk 'm!

  • Reinier
  • Registratie: Februari 2000
  • Nu online

Reinier

\o/

En wat als je drie rijen hebt voor een waarde in kolom 1? Wat wil je dan? max() of not null voldoet dan niet.

Acties:
  • 0 Henk 'm!

  • Josk79
  • Registratie: September 2013
  • Laatst online: 21-07 23:45
@Reinier

"Kan het ook voorkomen dat kolom 1 vaker voorkomt, maar waarbij kolom 2 wel meerdere keren gevuld is?"

"Nee"

Acties:
  • 0 Henk 'm!

  • Reinier
  • Registratie: Februari 2000
  • Nu online

Reinier

\o/

Excuus, meestal erger ik me aan niet-topiclezers ;)
Pagina: 1