Cookies op Tweakers

Tweakers maakt gebruik van cookies, onder andere om de website te analyseren, het gebruiksgemak te vergroten en advertenties te tonen. Door gebruik te maken van deze website, of door op 'Ga verder' te klikken, geef je toestemming voor het gebruik van cookies. Wil je meer informatie over cookies en hoe ze worden gebruikt, bekijk dan ons cookiebeleid.

Meer informatie
Toon posts:

[PostgreSQL] RANGE BETWEEN mbv Windowing

Pagina: 1
Acties:

Onderwerpen


  • kramer65
  • Registratie: oktober 2003
  • Laatst online: 14-01 16:15
Goedenavond,

Ik probeer een aantal zaken uit een database te halen, waaronder een maximum uit een range van future-prijzen. Dit maximum haalde ik eerst op mbv een subquery:
SQL:
1
2
3
4
5
6
7
8
9
10
11
SELECT n1.datum as datum,
n1.tijd as tijd,
   ((SELECT MAX(hoog) 
   FROM minutes_demo_no_id_tz_datetime n3
   WHERE n3.datum = n1.datum 
   AND n3.tijd >= n1.tijd
   AND n3.tijd < n2.tijd) - n1.open) as hoog
FROM minutes_demo_no_id_tz_datetime n1 
JOIN minutes_demo_no_id_tz_datetime n2 
ON (n2.tijd = n1.tijd + interval '40 minutes' + interval '1 hours') 
WHERE n1.datum = n2.datum

Nou begrijp ik echter dat het sneller en efficiënter kan mbv windowing, en dan specifiek de "RANGE BETWEEN x PRECEDING AND y FOLLOWING". Mbv een paar officiële pagina's over windowing probeer ik nu dus al een tijdje een query te schrijven. Het wil me echter maar niet lukken.

Wat ik tot nu toe heb is dit:
SQL:
1
2
3
4
5
6
7
SELECT n1.datum as datum,
n1.tijd as tijd,
    MAX(n1.hoog) OVER (RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as hoog
FROM minutes_demo_no_id_tz_datetime n1 
JOIN minutes_demo_no_id_tz_datetime n2 
ON (n2.tijd = n1.tijd + interval '40 minutes' + interval '1 hours') 
WHERE n1.datum = n2.datum

Ik gebruik nu echter álle records van de hele table, wat natuurlijk niet echt de bedoeling is. Ik wil de range dus verkleinen tot iets als "RANGE BETWEEN CURRENT ROW AND n2.tijd FOLLOWING". Ik krijg hier echter alleen maar foutmeldingen voor als "frame start at CURRENT ROW is not implemented" en "syntax error at or near "n2"".

Ik heb op google zitten zoeken naar voorbeelden (daar haal ik vaak het meeste uit) maar ik kan er niet bijster veel over vinden (heb gezocht op dingen als "postgresql windowing range between" en combinaties daarvan). Er zijn een aantal pagina's met voorbeelden vanuit Oracle, maar daar kan ik ook niet zoveel mee.

Heeft misschien iemand enig idee wat ik hier fout doe en hoe ik correct een range kan zetten zoals ik die in mijn subquery ook definiëer? Alle tips zijn welkom..

ps. Ik gebruik PostgreSQL versie 8.4.9

kramer65 wijzigde deze reactie 15-11-2011 22:30 (4%)


  • CyBeRSPiN
  • Registratie: februari 2001
  • Laatst online: 19:45

CyBeRSPiN

sinds 2001

Ehh, je mist je PARTITION BY?

  • kramer65
  • Registratie: oktober 2003
  • Laatst online: 14-01 16:15
Maar waar zou ik die PARTITION BY dan op moeten doen? Ik groepeer immers niet op basis van een bepaald veld, maar ik wil van een bepaald veld de maximale waarde tussen de tijden x en y.

Hoe zou jij hier PARTITION BY dan kunnen gebruiken?

kramer65 wijzigde deze reactie 15-11-2011 23:15 (3%)



Apple iPhone 11 Microsoft Xbox Series X LG OLED C9 Google Pixel 4 CES 2020 Samsung Galaxy S20 Sony PlayStation 5 Nintendo Switch Lite

'14 '15 '16 '17 2018

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2020 Hosting door True