[SQL] Oudste waarde uit een tabel halen

Pagina: 1
Acties:
  • 609 views sinds 30-01-2008
  • Reageer

  • Kamikazi
  • Registratie: Juli 2001
  • Niet online
De zoektoch hier op GoT leverde me onder andere dit topic op. Heb ook de oplossingen hiervan geprobeerd, maar ik krijg het niet werkend.

De situatie:

1 tabel, opgebouwd uit 3 velden: datum, klantID en code.

Voorbeeld van gegevens in die tabel
code:
1
2
3
4
datum        klantID      code 
20040611  10001       CAT01 
20040311  10001       CAT02 
20040223  10002       CAT02

Nu wil ik een query uitvoeren waarmee hij de datum, klantID en code weergeeft voor de oudste datum! Het resultaat zou dus moeten worden:

code:
1
2
3
datum        klantID      code 
20040311  10001       CAT02 
20040223  10002       CAT02

Deze query leek mij daarvoor de juiste:
code:
1
2
3
4
SELECT klantID, MIN(datum) as datum, code
FROM testtabel
GROUP BY klantID, code
ORDER BY klantID

Probleem is dat hij dan echter gewoon alle records (dus 2x klantID 10001 en 1x klantID 10002) ipv 1x klantID 10001 met datum 20040311 en 1x klantID 10002 met datum 20040223.

Met DISTINCT geeft de query ook niet het juiste resultaat. Wat doe ik fout?

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:52
Die query ziet er op 't eerste zicht idd goed uit.
Ben je zeker dat je GROUP BY clausule er zo uit ziet als diegene die je hier gepost hebt?

https://fgheysels.github.io/


  • Kamikazi
  • Registratie: Juli 2001
  • Niet online
Yep, is 100% hetzelfde

  • General_Failure
  • Registratie: Oktober 2000
  • Laatst online: 20-05 15:14

General_Failure

Vrolijk Pasen!!!

Omdat je in de group by ook code hebt staan, groepeert hij ook daarop. Wat wel zou moeten werken is:
code:
1
2
3
4
5
6
7
SELECT klantid, datum, code from testtable t
(SELECT klantID, MIN(datum) as datum
FROM testtabel
GROUP BY klantID) min
WHERE min.klantid = t.klantid
and min.datum = t.datum
order by klantid

Me and my dear friend General Protection-Error will invade your computer with our mighty army of Bugs. We will avoid the Firewall at the Gates of your PC by entering through your Windows.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Nogal wiedes dat dit alle records retourneert, je zoekt namelijk per unieke combinatie van KlantID en Code de laagste datum. En er zijn 3 van die unieke combinaties 8)7

edit:
wat General_Failure zegt dus, ik kreeg telefoon toen ik begon te typen :z

[ Voor 21% gewijzigd door curry684 op 24-06-2004 13:17 ]

Professionele website nodig?


Verwijderd

Dit probleem is volgens mij niet op te lossen in één query, je kunt namelijk de volgorde waarin er gegroupt wordt niet bepalen. Je kunt wel de oudste waarde uit een group halen, maar die hoeft dan weer niet te horen bij de andere waardes in die row...

Ik ben dus bang dat je de oudste row per klantID uit de db moet halen :'(

Wat natuurlijk kan op de manier zoals General_Failure die beschrijft, maar dan moet je database systeem wel subqueries ondersteunen

[ Voor 18% gewijzigd door Verwijderd op 24-06-2004 13:18 ]


  • py.mosjuh
  • Registratie: Oktober 2002
  • Laatst online: 24-10-2022

py.mosjuh

fikkert.net

Verwijderd schreef op 24 juni 2004 @ 13:17:
Dit probleem is volgens mij niet op te lossen in één query, je kunt namelijk de volgorde waarin er gegroupt wordt niet bepalen. Je kunt wel de oudste waarde uit een group halen, maar die hoeft dan weer niet te horen bij de andere waardes in die row...

Ik ben dus bang dat je de oudste row per klantID uit de db moet halen :'(

Wat natuurlijk kan op de manier zoals General_Failure die beschrijft, maar dan moet je database systeem wel subqueries ondersteunen
of je loopt door de tabel heen voor elke klant id en onthoudt het record met oudste datum.. ietwat omslachtig wellicht maar kan zo niet even een SQL query doen/valideren die het zou kunnen

Kites rise highest against the wind - not with it (Winston Churcill)


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

General_Failure schreef op 24 juni 2004 @ 13:10:
Omdat je in de group by ook code hebt staan, groepeert hij ook daarop. Wat wel zou moeten werken is:
code:
1
2
3
4
5
6
7
SELECT klantid, datum, code from testtable t
(SELECT klantID, MIN(datum) as datum
FROM testtabel
GROUP BY klantID) min
WHERE min.klantid = t.klantid
and min.datum = t.datum
order by klantid
Uhm ben ik nu gek of is dit met een correlated subquery veel korter en helderder:
SQL:
1
2
3
SELECT klantid, datum, code FROM testtable t
WHERE datum = (SELECT min(datum) FROM testtable tt WHERE tt.klantid = t.klantid)
ORDER BY klantid;

:?

Professionele website nodig?


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:52
Met een correlated subquery moet het idd veel eenvoudiger op te lossen zijn.

https://fgheysels.github.io/


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Not to mention dat die van mij wel werkt en die van hem niet ;)

Als ik de zijne corrigeer overigens zijn ze even snel in SQL Server volgens Query Analyzer (worden hetzelfde uitgevoerd op een gratis Compute Scalar na bij de grote query). Dan is de correlated subquery toch iets handiger, korter en helderder lijkt me :)

[ Voor 71% gewijzigd door curry684 op 24-06-2004 13:31 ]

Professionele website nodig?


  • Kamikazi
  • Registratie: Juli 2001
  • Niet online
Bedankt voor je tip Curry, ik heb het werkend gekregen ! :)
Happy me :)
Pagina: 1