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 परिभाषा:

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

पोस्टग्रेज बूलियन कास्ट ऑपरेटर ::int . का उपयोग करके ट्रू को 1, असत्य से 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL कॉलम को पंक्तियों में बदलें? स्थानान्तरण?

  2. Postgres में ब्लॉब डेटाटाइप का उपयोग कैसे करें

  3. पोस्टग्रेज:1 . से अधिक फ़ील्ड की गिनती वाली सभी पंक्तियों का चयन करें

  4. प्रदाता से डेटा पढ़ते समय एक त्रुटि हुई। सत्यापन प्रक्रिया के अनुसार दूरस्थ प्रमाणपत्र अमान्य है

  5. org.postgresql.util.PSQLException:त्रुटि:संबंध app_user मौजूद नहीं है