sql >> Database >  >> RDS >> PostgreSQL

Som tot drempelwaarde bereikt en reset vervolgens de teller

Gebruik door de gebruiker gedefinieerd aggregaat

Live-test:http://sqlfiddle.com/#!17/16816/2

SELECT *, sum_with_reset(distance, 10) over (order by date asc) as running_distance 
FROM tbl;

Door gebruiker gedefinieerde totale sum_with_reset definitie:

create or replace function sum_reset_accum(
    _accumulated numeric, _current numeric, _threshold numeric
)
returns numeric as
$$
    select case when _accumulated >= _threshold then
        _current
    else
        _current + _accumulated
    end    
$$ language sql;


create aggregate sum_with_reset(numeric, numeric)
(
    sfunc = sum_reset_accum,
    stype = numeric,
    initcond = 0
);

Gegevens

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)
;

Uitvoer:

| user_id |                 date | distance | running_distance |
|---------|----------------------|----------|------------------|
|       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 |

Oneliner:

create or replace function sum_reset_accum(
    _accumulated numeric, _current numeric, _threshold numeric
)
returns numeric as
$$
    select _current + _accumulated * (_accumulated < _threshold)::int
$$ language 'sql';

Postgres boolean kan true casten naar 1, false naar 0 met behulp van cast-operator ::int .

U kunt plpgsql . gebruiken ook taal:

create or replace function sum_reset_accum(
    _accumulated numeric, _current numeric, _threshold numeric
)
returns numeric as
$$begin
    return _current + _accumulated * (_accumulated < _threshold)::int;
end$$ language 'plpgsql';

Merk op dat u geen plpgsql-functie kunt maken op sqlfiddle.com, dus u kunt die plpgsql-code niet testen op sqlfiddle.com. Dat kan wel, op je computer.



  1. Hoe een CSV-bestand in de MySQL-tabel te importeren

  2. Kopieer een tabel met gegevens van de ene MySQL-server naar de andere

  3. Mysql-kolombeperking als niet leeg / vereist

  4. Rijnummer voor zoekopdrachtresultaten gegroepeerd op een kolom