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:
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:
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
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
[ Voor 4% gewijzigd door kramer65 op 15-11-2011 22:30 ]