Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[MsSQL] query op peildatum op waarden met alleen begindatum

Pagina: 1
Acties:

  • Milmoor
  • Registratie: Januari 2000
  • Laatst online: 21-11 13:19

Milmoor

Footsteps and pictures.

Topicstarter
Ik heb een set waarden met alleen een begindatum. Daarvan wil ik de waarde hebben die op een specifieke peildatum geldig is.

Als de waarden ook een einddatum hebben is het makkelijk:
SELECT value
FROM table
WHERE startdate <= mydate AND
(enddate IS NULL OR enddate >= mydate)

Maar hoe doe ik dat netjes als ik alleen een startdatum heb en het moment van niet meer geldig zijn afgeleid wordt van of er een waarde is met een hoger startdatum is? Dit doe ik nu:

SELECT value
FROM table LEFT OUTER JOIN table_later ON
table.startdate < table_later.startdate AND
table.startdate <= mydate AND
table_later.startdate <= mydate AND
table_later.startdate IS NULL

Ik heb dus twee keer de tabel gejoined met de startdatum <= peildatum, waarbij de tweede met een left outer join gekoppeld is (dus NULL mag zijn) en NULL moet zijn en een startdatum > dan de eerste tabel moet hebben. Een ingewikkelde manier om te zeggen dat er geen waarden mogen zijn die tussen de opgeleverde waarden en de peildatum inliggen. Dit is natuurlijk niet mooi. Maar hoe doe ik dit wel goed?

[ Voor 0% gewijzigd door Milmoor op 05-11-2014 22:10 . Reden: enters in query toegevoegd ]

Rekeningrijden is onvermijdelijk, uitstel is struisvogelpolitiek.


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Heb je nog enige invloed op het model? Dit gaat namelijk een stukje makkelijker als je niet de startdatum opslaat in je nieuwe record en de einddatum weglaat maar de einddatum opslaat in je oude record. De startdatum heb je dan in principe zelfs niet meer nodig.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Milmoor
  • Registratie: Januari 2000
  • Laatst online: 21-11 13:19

Milmoor

Footsteps and pictures.

Topicstarter
Helaas niet. Dat is afkomstig van de leverancier van onze basisadministratie. Ik kan zaken toevoegen, maar van de basistabellen moet ik afblijven. Ik zie trouwens niet hoe je het zonder startdatum zou kunnen queryen als je wel een einddatum hebt.

Rekeningrijden is onvermijdelijk, uitstel is struisvogelpolitiek.


  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Het is een beetje db-afhankelijk of het sneller is of niet.

Maar wat ik over het algemeen doe bij dit soort dingen is een subquery in de trant van :
SQL:
1
2
3
4
select waarde,max(startdatum)
from foo
where startdatum<peildatum
group by waarde

en dan heb je je waarde en datum die je moet hebben en kan je in je outer-query de rest van de gegevens erbij pakken.

Of als je alleen een willekeurige waarde nodig hebt dan een subquery als volgt
SQL:
1
2
3
select max(startdatum)
from foo
where startdatum<peildatum

En dan in je outer-query je waarde bij die datum pakken.

Het is net een andere benadering, ik ben niet geinteresseerd of iets een nog hogere startdatum heeft, ik ben enkel geinteresseerd in de hoogste startdatum die voor de peildatum ligt en van daaruit zoek ik de rest van de gegevens erbij

  • Milmoor
  • Registratie: Januari 2000
  • Laatst online: 21-11 13:19

Milmoor

Footsteps and pictures.

Topicstarter
Ik snap hem nog niet. Stel je hebt.

waarde, startdatum
6, 1 januari 2011
2, 4 juni 2012
2, 1 december 2013
2, 5 december 2013
4, 5 januari 2014

Dan geeft jouw eerste query met peildatum 2 december 2013
6, 1 januari 2011
2, 1 december 2013

De tweede geeft met peildatum 2 december 2013:
1 december 2013

Je uitgangspunt ben ik het inderdaad mee eens, dat is niet van belang. Wat ik zoek is trouwens (en het zijn WOZ waarden van huurwoningen):
2, 1 december 2013

[ Voor 12% gewijzigd door Milmoor op 05-11-2014 22:23 ]

Rekeningrijden is onvermijdelijk, uitstel is struisvogelpolitiek.


  • Merethil
  • Registratie: December 2008
  • Laatst online: 21:36
Milmoor schreef op woensdag 05 november 2014 @ 22:19:
De tweede geeft met peildatum 2 december 2013:
1 december 2013

Je uitgangspunt ben ik het inderdaad mee eens, dat is niet van belang. Wat ik zoek is trouwens (en het zijn WOZ waarden van huurwoningen):
2, 1 december 2013
Zoals hij verder al zei: Je kan die max(startdatum) dan weer verder gebruiken in een join of subquery zodat je de bijbehorende waarde kan vinden.

[ Voor 21% gewijzigd door Merethil op 06-11-2014 07:20 ]


  • Milmoor
  • Registratie: Januari 2000
  • Laatst online: 21-11 13:19

Milmoor

Footsteps and pictures.

Topicstarter
Duh, ik was niet meer helder:

SELECT value
FROM table
WHERE startdate =
(SELECT MAX(startdate)
FROM table
WHERE startdate<mydate)

Rekeningrijden is onvermijdelijk, uitstel is struisvogelpolitiek.


  • Rotterdammertje
  • Registratie: Juni 2002
  • Laatst online: 28-03-2023
In MsSQL kan je toch ook gebruik maken van analytic functions?

SQL:
1
2
3
4
5
6
SELECT id FROM
(
  SELECT id, value, LEAD(value) OVER (ORDER BY startdate) AS next_value
  FROM table
) AS fixed_table
WHERE value <= x AND next_value > x;

[ Voor 3% gewijzigd door Rotterdammertje op 06-11-2014 10:53 ]

main = putStr (q ++ show q); q = "main = putStr (q ++ show q); q = "


  • Wes46
  • Registratie: Augustus 2005
  • Laatst online: 20-03 09:38

Wes46

Keep it simple.

Kun je niet simpel dit doen:

SQL:
1
SELECT TOP 1 Value FROM Table WHERE StartDate <= mydate ORDER BY StartDate desc


Ik zal wel iets over het hoofd zien aangezien dit wel heel simpel zou zijn.

[ Voor 22% gewijzigd door Wes46 op 06-11-2014 12:54 ]

iRacing


  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Wes46 schreef op donderdag 06 november 2014 @ 12:52:
Kun je niet simpel dit doen:

SQL:
1
SELECT TOP 1 Value FROM Table WHERE StartDate <= mydate ORDER BY StartDate desc


Ik zal wel iets over het hoofd zien aangezien dit wel heel simpel zou zijn.
In theorie kan het, maar het zou absoluut niet mijn geprefereerde manier zijn. Je hebt nu namelijk subtiel de vraag veranderd naar "Geef mij de 1e waarde die geldig is op een specifieke peildatum".
Dat hoeft nu geen probleem te zijn, maar als er ooit een situatie komt dat je meerdere waardes hebt op 1 startdatum dan krijg je niet meer alles uit je originele vraag.

Dat zijn nu net van die leuke dingetjes die je of heel expliciet moet opschrijven dat je de beginvraag aangepast hebt, of die je over 2 jaar vele dagen bughunten gaan kosten omdat je niet meer alles terugkrijgt wat je wel verwacht.

  • Wes46
  • Registratie: Augustus 2005
  • Laatst online: 20-03 09:38

Wes46

Keep it simple.

Klopt je krijgt alleen maar 1 waarde terug maar dat werd dus niet gespecificeerd.
Daarvan wil ik de waarde hebben die op een specifieke peildatum geldig is.
Mocht je toch uiteindelijk meerdere waarden willen hebben dan zou ik dat niet afhandelen in SQL maar die logica ergens anders plaatsen.

iRacing


  • Milmoor
  • Registratie: Januari 2000
  • Laatst online: 21-11 13:19

Milmoor

Footsteps and pictures.

Topicstarter
In dit geval is er altijd maar een waarde actief, dus dat gaat goed. Dus voor mij een prima oplossing. Achteraf heel logisch, maar vooraf was dat nog niet duidelijk. Bedankt voor het meedenken.

Rekeningrijden is onvermijdelijk, uitstel is struisvogelpolitiek.

Pagina: 1