Dit is wellicht een hele simpele vraag voor de SQL guru's, maar ik kom er even niet uit.
Ik zoek de efficiëntste manier om (met Postgres) elke n-rows te sommeren. Dus stel:
Hier wil ik, als ik per 2, wil sommeren, het volgende dus bijvoorbeeld uit krijgen.
Of per 4:
Nu gebruik ik hiervoor een window function, waarbij ik "n" en "startindex" natuurlijk invul:
Nu werkt dit prima, maar wordt steeds langzamer voor grote waardes van n. Om dit te optimaliseren dacht ik een conditie aan de window function toe te voegen. Iets als
Ik krijg echter het gevoel dat een wiundow function misschien helemaal niet is wat ik moet gebruiken om dit probleem op te lossen en ik veel simpeler iets met een SUM en GROUP BY kan doen. Heeft iemand suggesties?
Ik zoek de efficiëntste manier om (met Postgres) elke n-rows te sommeren. Dus stel:
code:
1
2
3
4
5
6
7
8
| 1 0.2 2 0.1 3 0.7 4 0.6 5 0.5 6 0.9 7 0.9 8 0.1 |
Hier wil ik, als ik per 2, wil sommeren, het volgende dus bijvoorbeeld uit krijgen.
code:
1
2
3
4
| 1 0.3 3 1.3 5 1.4 7 1.0 |
Of per 4:
code:
1
2
| 1 1.6 5 2.4 |
Nu gebruik ik hiervoor een window function, waarbij ik "n" en "startindex" natuurlijk invul:
SQL:
1
2
3
4
| SELECT * FROM (SELECT sum(value) OVER (order by 'index' ROWS BETWEEN current row AND n-1 following) FROM mytable WHERE ('index' % n) = startindex % n; |
Nu werkt dit prima, maar wordt steeds langzamer voor grote waardes van n. Om dit te optimaliseren dacht ik een conditie aan de window function toe te voegen. Iets als
code:
om zo te zorgen dat niet voor elke row, die ik uiteindelijk toch niet wil hebben de window function wordt uitgevoerd, maar alleen voor de n-de rows die ik wil hebben.1
| WHEN (currentrow % n) = startindex % n; |
Ik krijg echter het gevoel dat een wiundow function misschien helemaal niet is wat ik moet gebruiken om dit probleem op te lossen en ik veel simpeler iets met een SUM en GROUP BY kan doen. Heeft iemand suggesties?
[ Voor 4% gewijzigd door EddoH op 04-03-2016 11:37 ]