[SQL] Selecteren eerste geldige set trajecten

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • storeman
  • Registratie: April 2004
  • Laatst online: 23:07
Ik zit met een probleem wat niet zo moeilijk lijkt, maar waar ik nu even niet meer uitkom (blackout?).

Ik heb een tabel met de volgende relevante kolommen:

code:
1
| id | from_id | to_id | valid_from | valid_untill | tarif


Er is per tijdsbestek maar één tarief mogelijk, geen overlap dus.

Nu wil ik per traject het tarief selecteren dat nu geldig is of het dichtstbijzijnde in de toekomst.

Ik het eerste wat me dan te binnen schiet is gebruik maken van een group by, echter loop ik dan nog vast.

SQL:
1
2
3
SELECT from_id, to_id, MIN(valid_from), MIN(valid_untill), tarif
WHERE valid_untill_date >= CURRENT_DATE
GROUP BY from_id, to_id


Maar ja, dit gaat natuurlijk nog niet werken ivm de 'tarif' kolom. Volgens mij ontkom ik nu niet aan een subquery, maar ik zie even niet hoe ik deze invulling moet geven.

"Chaos kan niet uit de hand lopen"


Acties:
  • 0 Henk 'm!

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

SQL:
1
2
3
4
5
6
7
8
9
select t.*
from tabel t
where t.valid_from = 
(select min(t2.valid_from) 
from tabel t2 
where t2.from_id = t.from_id 
and t2.to_id=t.to_id 
and t2.valid_until >= current_date
)

Who is John Galt?


Acties:
  • 0 Henk 'm!

  • DamadmOO
  • Registratie: Maart 2005
  • Laatst online: 19-09 19:31
Om het tarief te krijgen wat nu geldig is doe je
SQL:
1
2
3
SELECT from_id, to_id, valid_from, valid_untill, tarif 
FROM tabel
WHERE GETDATE() BETWEEN valid_from AND ISNULL(valid_untill,GETDATE())


Als het selecteren van een waarde in de toekomst belangrijk is voor je dan kan je je huidige query gebruiken en dan de tarif vervangen door een subquery waar je de waardes gebruikt die je krijgt van je aggregatie.

SQL:
1
2
3
4
SELECT from_id, to_id, MIN(valid_from), MIN(valid_untill), (select tarif from tabel as t2 where t2.valid_from = MIN(T1.valid_from) and t2.valid_untill = MIN(t1.valid_untill) /* en de andere dingen die het uniek maken */
FROM table as T1
WHERE valid_untill_date >= CURRENT_DATE 
GROUP BY from_id, to_id


Verder hoop ik dat je de kolomnamen nog kan aanpassen. Het is namelijk valid_till of valid_until, maar geen valid_untill. En tarif is voor zover ik weet geen engels woord, wanneer tarief bedoeld is dan is het beter om geen engels met nederlands te mixen. Dat wordt op den duur gewoon een rotzooi.

Acties:
  • 0 Henk 'm!

  • storeman
  • Registratie: April 2004
  • Laatst online: 23:07
Bedankt voor de opmerkingen. Ik heb de query van justmental gebruikt en werkt perfect! Bedankt.

@DamadmOO, bedankt voor je opmerkingen mbt kolomnamen, hier ben ik niet altijd even consequent in. (tabelnamen netzo). Dit leidt inderdaad nog wel eens tot gepruts. Helaas ben ik nu al in een stadium dat ik dat niet zomaar kan veranderen. Echter is het project dermate groot geworden dat er allerlei zaken zijn ontstaan die verre van mooi zijn (maar dat hadden we niet aan kunnen zien komen). Voor nu werkt het en wordt het naar tevredenheid gebruikt. Het onderhoud wordt echter steeds moeilijker, een versie 2 moet maar eens gemaakt worden zodat alles ontworpen wordt met het oog op de huidige eisen.

De tabellen heb ik allemaal goed genormaliseerd, echter geeft dit nu ook z'n beperkingen/problemen. Als ik hier mee aan de slag ga, zal ik nog eens een topic openen over de problemen die ik tegenkom/afwegingen die ik moet maken.

"Chaos kan niet uit de hand lopen"