PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

GROUP BY लगातार दिनांक अंतराल द्वारा सीमांकित

create table t ("date" date, "value" int);
insert into t ("date", "value") values
    ('2011-10-31', 2),
    ('2011-11-01', 8),
    ('2011-11-02', 10),
    ('2012-09-13', 1),
    ('2012-09-14', 4),
    ('2012-09-15', 5),
    ('2012-09-16', 20),
    ('2012-10-30', 10);

सरल और सस्ता संस्करण:

select min("date"), max("date"), sum(value)
from (
    select
        "date", value,
        "date" - (dense_rank() over(order by "date"))::int g
    from t
) s
group by s.g
order by 1

मेरी पहली कोशिश अधिक जटिल और महंगी थी:

create temporary sequence s;
select min("date"), max("date"), sum(value)
from (
    select 
        "date", value, d,
        case 
            when lag("date", 1, null) over(order by s.d) is null and "date" is not null 
                then nextval('s')
            when lag("date", 1, null) over(order by s.d) is not null and "date" is not null 
                then lastval()
            else 0 
        end g
    from 
        t
        right join
        generate_series(
            (select min("date") from t)::date, 
            (select max("date") from t)::date + 1, 
            '1 day'
        ) s(d) on s.d::date = t."date"
) q
where g != 0
group by g
order by 1
;
drop sequence s;

आउटपुट:

    min     |    max     | sum 
------------+------------+-----
 2011-10-31 | 2011-11-02 |  20
 2012-09-13 | 2012-09-16 |  30
 2012-10-30 | 2012-10-30 |  10
(3 rows)


  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. पोस्टग्रेज सत्र क्या है?

  3. रेक निरस्त! Gem::LoadError:डेटाबेस एडेप्टर के लिए निर्दिष्ट 'postgresql'

  4. पोस्टग्रेस्क्ल में पहला और अंतिम मूल्य कुल कार्य करता है जो NULL मानों के साथ सही ढंग से काम करता है

  5. मैं psycopg2/पायथन डीबी एपीआई के साथ डेटाबेस लेनदेन कैसे करूं?