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定義:

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

    データ

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

    ワンライナー:

    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ブール値は、キャスト演算子::intを使用して、trueを1に、falseを0にキャストできます。 。

    plpgsqlを使用できます 言語も:

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

    sqlfiddle.comでplpgsql関数を作成できないため、sqlfiddle.comでそのplpgsqlコードをテストできないことに注意してください。ただし、マシン上では可能です。



    1. OrmliteまたはsqliteどちらがAndroidの観点に適していますか?

    2. サーバーを起動できません:TCP / IPポートでバインド:要求されたアドレスを割り当てることができません

    3. MySQLがODBC日付パラメータを使用して正しい結果を生成しない

    4. 死ぬことのないゾンビPerfMonカウンター!