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