Bạn có thể tạo một bảng "nhóm" bằng cách thêm các khoảng được tạo bởi create_series (). Câu lệnh SQL này sẽ tạo một bảng gồm các nhóm năm phút cho ngày đầu tiên (giá trị của min(measured_at)
) trong dữ liệu của bạn.
select
(select min(measured_at)::date from measurements) + ( n || ' minutes')::interval start_time,
(select min(measured_at)::date from measurements) + ((n+5) || ' minutes')::interval end_time
from generate_series(0, (24*60), 5) n
Quấn đó trong một biểu thức bảng chung và bạn có thể tham gia và nhóm trên đó như thể nó là một bảng cơ sở.
with five_min_intervals as (
select
(select min(measured_at)::date from measurements) + ( n || ' minutes')::interval start_time,
(select min(measured_at)::date from measurements) + ((n+5) || ' minutes')::interval end_time
from generate_series(0, (24*60), 5) n
)
select f.start_time, f.end_time, avg(m.val) avg_val
from measurements m
right join five_min_intervals f
on m.measured_at >= f.start_time and m.measured_at < f.end_time
group by f.start_time, f.end_time
order by f.start_time
Việc nhóm theo một số giây tùy ý cũng tương tự - sử dụng date_trunc()
.
Việc sử dụng phổ biến hơn của create_series () cho phép bạn tránh đoán giới hạn trên cho giới hạn năm phút. Trong thực tế, bạn có thể xây dựng cái này dưới dạng một dạng xem hoặc một hàm. Bạn có thể nhận được hiệu suất tốt hơn từ bảng cơ sở.
select
(select min(measured_at)::date from measurements) + ( n || ' minutes')::interval start_time,
(select min(measured_at)::date from measurements) + ((n+5) || ' minutes')::interval end_time
from generate_series(0, ((select max(measured_at)::date - min(measured_at)::date from measurements) + 1)*24*60, 5) n;