I want to GROUP by
data by time range. The example I have start_date
and end_date
, and I want
the separate range between start_date
and end_date
on 25
range and get sum value
from 1
to 25
.
Simple presentation of my table:
select * from t1 where time between start_date and end_date
table t1 have:
time 2019-10-01 value 50 time 2019-10-01 value 50 time 2019-10-02 value 50 time 2019-10-02 value 50 time 2019-10-02 value 50 time 2019-10-02 value 50 time 2019-10-03 value 50 time 2019-10-04 value 50 time 2019-10-05 value 50 time 2019-10-05 value 50 time 2019-10-05 value 50 start_date 2019-10-01 end_date 2019-10-25
generate_series
function to separate on
2019-10-01 2019-10-02 2019-10-03 2019-10-04 2019-10-05 2019-10-06 2019-10-07 2019-10-07 2019-10-07 2019-10-08 2019-10-09 2019-10-10 2019-10-11 2019-10-12 2019-10-13 2019-10-14 2019-10-15 2019-10-16 2019-10-17 2019-10-18 2019-10-19 2019-10-20 2019-10-21 2019-10-22 2019-10-23 2019-10-24 2019-10-25
and sum by how this 25
for 2019-10-01
to have value 100
for 2019-10-02
to have value 400
Advertisement
Answer
I am going to recommend a lateral join:
select d.dt, t.total_value from generate_series(date '2019-10-01', date '2019-10-25', interval '1' day ) d(dt) left join lateral (select coalesce(sum(value), 0) as total_value from t where t.time >= d.dt and t.time < d.dt + interval '1' day ) t on true;
A lateral join can have better performance than overall aggregation, particularly with an index on (time, value)
.