PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Сумирайте до достигане на праговата стойност и след това нулирайте брояча

Използвайте дефиниран от потребителя агрегат

Тест на живо: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. Можете обаче на вашата машина.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL схеми/пространства от имена с Django

  2. извикване на SQL функция в R функция

  3. SQL - Комбиниране на множество подобни заявки

  4. Избор на схема за динамично изпълнение на PostgreSQL в jOOQ

  5. Смесването на изрично и неявно свързване е неуспешно с Има запис за таблица ... но не може да бъде препратен от тази част на заявката