Използвайте дефиниран от потребителя агрегат
Тест на живо:http://sqlfiddle.com/#!17/16716/2
SELECT *, sum_with_reset(distance, 10) over (order by date asc) as running_distance FROM tbl;
Дефинирана от потребителя агрегатна дефиниция sum_with_reset:
създайте или заменете функция sum_reset_accum( _accumulated numeric, _current numeric, _threshold numeric)връща число като$$ изберете случай, когато _accumulated>=_threshold then _current else _current + _accumulated end $$ language sql;create aggregate sum_with_reset(numeric , числено)( sfunc =sum_reset_accum, stype =числово, initcond =0);
Данни
CREATE TABLE tbl ("user_id" int, "date" timestamp, "distance" int); INSERT INTO tbl ("user_id", "date", "distance") VALUES (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);
Изход:
<предварителен код>| user_id | дата | разстояние | разстояние_пробег ||---------|-----------------------|----------|--- ---------------|| 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 |Едноредов:
създайте или заменете функция sum_reset_accum( _accumulated numeric, _current numeric, _threshold numeric)връща число като$$ изберете _current + _accumulated * (_accumulated <_threshold)::int$$ език 'sql';
Postgres boolean може да преобразува true до 1, false до 0 чрез използване на оператор за прехвърляне ::int
.
Можете да използвате plpgsql
език също:
create or replace function sum_reset_accum( _accumulated numeric, _current numeric, _threshold numeric)връща число as$$begin return _current + _accumulated * (_accumulated <_threshold)::int;end$$ language 'plpgsql';код>
Имайте предвид, че не можете да създадете plpgsql функция на sqlfiddle.com, така че не можете да тествате този plpgsql код на sqlfiddle.com. Можете обаче на вашата машина.