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:
x
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)
.