sql >> Database teknologi >  >> RDS >> PostgreSQL

Sum indtil tærskelværdien er nået, og nulstil derefter tælleren

Brug brugerdefineret aggregat

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.



  1. Opdel MYSQL-resultater i 4 arrays

  2. Hvordan filtreres GRUPPE BY-post yderligere i mysql?

  3. Sådan designes en geografisk distribueret MariaDB-klynge

  4. Få alle børn efter forældre-id og hvor-klausul i mysql