我正在使用Postgres8.1数据库,我想编写一个查询,选择间隔4小时的数据。
因此,正如图像显示的subscriber_id与日期,这是如何目前的数据在数据库和
我想要这样的数据
No. of Subscriber | Interval
0 0-4
0 4-8
7 8-12
1 12-16
0 16-20
0 20-24
基本上,在每一天,我们有24小时,如果除以24/4=6,意味着我每天总共有6个间隔
0-4
4-8
8-12
12-16
16-20
20-24
因此,我需要在这些时间间隔内的订户数量。postgres中是否有数据函数来解决我的问题,或者如何编写这个问题的查询?
注意:请按照postgres 8.1版本编写解决方案
发布于 2017-06-12 11:58:20
使用generate_series()
生成具有适当句点的句点和左联接date_time
,例如:
with my_table(date_time) as (
values
('2016-10-24 11:10:00'::timestamp),
('2016-10-24 11:20:00'),
('2016-10-24 15:10:00'),
('2016-10-24 21:10:00')
)
select
format('%s-%s', p, p+4) as "interval",
sum((date_time notnull)::int) as "no of subscriber"
from generate_series(0, 20, 4) p
left join my_table
on extract(hour from date_time) between p and p+ 4
group by p
order by p;
interval | no of subscriber
----------+------------------
0-4 | 0
4-8 | 0
8-12 | 2
12-16 | 1
16-20 | 0
20-24 | 1
(6 rows)
我不认为有一个活生生的人会记得8.1版。你可以试试:
create table periods(p integer);
insert into periods values (0),(4),(8),(12),(16),(20);
select
p as "from", p+4 as "to",
sum((date_time notnull)::int) as "no of subscriber"
from periods
left join my_table
on extract(hour from date_time) between p and p+ 4
group by p
order by p;
from | to | no of subscriber
------+----+------------------
0 | 4 | 0
4 | 8 | 0
8 | 12 | 2
12 | 16 | 1
16 | 20 | 0
20 | 24 | 1
(6 rows)
发布于 2017-06-12 11:39:16
在Postgres中,您可以通过为您的时间段生成所有时间间隔来实现这一点。这有点棘手,因为您必须选择数据中的日期。然而,generate_series()
确实很有帮助。
剩下的只是一个left join
和聚合:
select dt.dt, count(t.t)
from (select generate_series(min(d.dte), max(d.dte) + interval '23 hour', interval '4 hour') as dt
from (select distinct date_trunc('day', t.t)::date as dte from t) d
) dt left join
t
on t.t >= dt.dt and t.t < dt.dt + interval '4 hour'
group by dt.dt
order by dt.dt;
请注意,这将将期间保留为期间开始的日期/时间。您可以很容易地将其转换为日期和间隔号,如果这更有帮助的话。
发布于 2017-06-12 11:44:14
我认为如果您运行六种不同的查询,因为您知道时间间隔(下限和上限)将更好。
https://stackoverflow.com/questions/44498385
复制相似问题