Postgresql 问题中没有版本信息。时间戳参数在8.4中引入;早期版本在2012年仍被广泛使用。即使在今天,一些派生产品(如GreenPlum和Amazon Redshift)也不支持generate_series中的时间戳参数。此解决方案使间隔边界根据数据中可用的最小和

Postgresql 问题中没有版本信息。时间戳参数在8.4中引入;早期版本在2012年仍被广泛使用。即使在今天,一些派生产品(如GreenPlum和Amazon Redshift)也不支持generate_series中的时间戳参数。此解决方案使间隔边界根据数据中可用的最小和,postgresql,group-by,Postgresql,Group By,问题中没有版本信息。时间戳参数在8.4中引入;早期版本在2012年仍被广泛使用。即使在今天,一些派生产品(如GreenPlum和Amazon Redshift)也不支持generate_series中的时间戳参数。此解决方案使间隔边界根据数据中可用的最小和最大时间戳移动。它可能不适用于动态(也称为“活动”)图表,因为沿X轴的标签将更改。如果是这种情况,绝对间隔(不绑定到最小/最大数据)可能会更好。这是一种商业模式product@geotheory只有他们的托管云服务。该扩展是在Apache2.0


问题中没有版本信息。时间戳参数在8.4中引入;早期版本在2012年仍被广泛使用。即使在今天,一些派生产品(如GreenPlum和Amazon Redshift)也不支持
generate_series
中的时间戳参数。此解决方案使间隔边界根据数据中可用的最小和最大时间戳移动。它可能不适用于动态(也称为“活动”)图表,因为沿X轴的标签将更改。如果是这种情况,绝对间隔(不绑定到最小/最大数据)可能会更好。这是一种商业模式product@geotheory只有他们的托管云服务。该扩展是在Apache2.0许可下开源的。所以我看不出有什么问题。您不需要使用他们的托管服务。感谢您向Tom澄清
CREATE TABLE measurements(
measured_at TIMESTAMPTZ,
val INTEGER
);
microseconds,
milliseconds
.
.
.
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
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
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;
with intervals as (
    select
        (n||' minutes')::interval as start_time, 
        ((n+30)|| ' minutes')::interval as end_time
    from generate_series(0, (23*60+30), 30) n
)
select i.start_time, o.service, avg(o.o)
from
observations o right join intervals i
on o.time >= i.start_time and o.time < i.end_time
where o.date between '2013-01-01' and '2013-01-31'
group by i.start_time, i.end_time, o.service
order by i.start_time
WITH interval_query AS (
    SELECT (ts ||' hour')::INTERVAL AS hour_interval
    FROM generate_series(0,23) AS ts
), time_series AS (
    SELECT date_trunc('hour', now()) + INTERVAL '60 min' * ROUND(date_part('minute', now()) / 60.0) - interval_query.hour_interval AS start_time
    FROM interval_query
), time_intervals AS (
    SELECT start_time, start_time + '1 hour'::INTERVAL AS end_time
    FROM time_series ORDER BY start_time
), reading_counts AS (
    SELECT f.start_time, f.end_time, br.minor, count(br.id) readings
    FROM beacon_readings br
    RIGHT JOIN time_intervals f
                    ON br.reading_timestamp >= f.start_time AND br.reading_timestamp < f.end_time AND br.major = 4
    GROUP BY f.start_time, f.end_time, br.minor
    ORDER BY f.start_time, br.minor
)
SELECT * FROM reading_counts
SELECT MIN(val), 
EXTRACT(epoch FROM measured_at) / EXTRACT(epoch FROM INTERVAL '5 min') AS int 
FROM measurements 
GROUP BY int
select measured_at, 
       val, 
       (date_trunc('seconds', (measured_at - timestamptz 'epoch') / 300) * 300 + timestamptz 'epoch') as aligned_measured_at
from measurements;
with intervals as (
    select tstzrange(s, s + '5 minutes') das_interval
    from (select generate_series(min(lower(time_range)), max(upper(time_rage)), '5 minutes') s
          from your_table) x)
select das_interval, your_table.*
from   your_table
right join intervals on time_range && das_interval
order by das_interval;
create or replace function interval_generator(start_ts timestamp with TIME ZONE, end_ts timestamp with TIME ZONE, round_interval INTERVAL)
    returns TABLE(start_time timestamp with TIME ZONE, end_time timestamp with TIME ZONE) as $$
BEGIN
return query
        SELECT
            (n)       start_time,
            (n + round_interval) end_time
        FROM generate_series(date_trunc('minute', start_ts), end_ts, round_interval) n;
END
$$
    LANGUAGE 'plpgsql';
with intervals as (select * from interval_generator(NOW() - INTERVAL '24 hours' , NOW(), '30 seconds'::INTERVAL))
select f.start_time, m.session_id, m.metric, min(m.value) min_val, avg(m.value) avg_val, max(m.value) max_val
from ts_combined as m
inner JOIN intervals f
    on m.time >= f.start_time and m.time < f.end_time
GROUP BY f.start_time, f.end_time, m.metric, m.session_id
ORDER BY f.start_time desc