Live test:http://sqlfiddle.com/#!17/16716/2
SELECT *, sum_with_reset(distance, 10) over (rækkefølge efter dato asc) som running_distance FROM tbl;
Brugerdefineret samlet sum_med_nulstil definition:
opret eller erstat funktionen sum_reset_accum( _accumulated numeric, _current numeric, _threshold numeric)returnerer numeric as$$ vælg store og små bogstaver, når _accumulated>=_threshold derefter _current else _current + _accumulated language:_accumulated_current + _accumulated language; , numerisk)( sfunc =sum_reset_accum, stype =numeric, initcond =0);
Data
OPRET TABEL tbl ("bruger_id" int, "dato" tidsstempel, "afstand" int); INSERT INTO tbl ("bruger_id", "dato", "distance") VÆRDIER (1, '2019-04 -09 00:00:00', 2), (1, '2019-04-09 00:00:30', 5), (1, '2019-04-09 00:01:00', 3), (1, '2019-04-09 00:01:45', 7), (1, '2019-04-09 00:02:30', 6), (1, '2019-04-09 00:03 :00', 1);
Output:
| bruger_id | dato | afstand | løbedistance ||--------|----------------------|--------|--- ---------------|| 1 | 2019-04-09T00:00:00Z | 2 | 2 || 1 | 2019-04-09T00:00:30Z | 5 | 7 || 1 | 2019-04-09T00:01:00Z | 3 | 10 || 1 | 2019-04-09T00:01:45Z | 7 | 7 || 1 | 2019-04-09T00:02:30Z | 6 | 13 || 1 | 2019-04-09T00:03:00Z | 1 | 1 |
One-liner:
opret eller erstat funktion sum_reset_accum( _accumulated numeric, _current numeric, _threshold numeric)returnerer numeric as$$ select _current + _accumulated * (_accumulated <_threshold)::int$$ language 'sql';
Postgres boolean kan caste sand til 1, falsk til 0 ved at bruge cast-operatoren ::int
.
Du kan bruge plpgsql
også sprog:
opret eller erstat funktion sum_reset_accum( _accumulated numeric, _current numeric, _threshold numeric)returnerer numeric as$$begin return _current + _accumulated * (_accumulated <_threshold)::int;end$ql language 'pl';
Bemærk, at du ikke kan oprette plpgsql-funktion på sqlfiddle.com, så du kan ikke teste den plpgsql-kode på sqlfiddle.com. Det kan du dog på din maskine.