Update
As Evan Carrol has pointed out on him comments you can avoid use CTE and change function language from plpgsql to plain SQL.
CREATE OR REPLACE FUNCTION GroupIntervals(low int, high int, step int) RETURNS TABLE (amount int, interv int) AS $$ SELECT COALESCE(SUM(T.amount),0)::int AS amount, CTS.Serie as interv FROM generate_series(low, high, step) AS CTS(Serie) LEFT JOIN T ON index >= CTS.Serie AND index < CTS.Serie + step GROUP BY CTS.Serie ORDER BY CTS.Serie; $$ LANGUAGE sql;
SELECT * FROM GroupIntervals(0, 14, 4);amount | interv -----: | -----: 55 | 0 219 | 4 175 | 8 0 | 12
SELECT * FROM GroupIntervals(5, 14, 5);amount | interv -----: | -----: 219 | 5 175 | 10
dbfiddle here