首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >选择查询以获取间隔为4小时的数据

选择查询以获取间隔为4小时的数据
EN

Stack Overflow用户
提问于 2017-06-12 11:30:24
回答 3查看 1.2K关注 0票数 0

我正在使用Postgres8.1数据库,我想编写一个查询,选择间隔4小时的数据。

因此,正如图像显示的subscriber_id与日期,这是如何目前的数据在数据库和

我想要这样的数据

代码语言:javascript
运行
复制
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个间隔

代码语言:javascript
运行
复制
0-4
4-8
8-12
12-16
16-20
20-24

因此,我需要在这些时间间隔内的订户数量。postgres中是否有数据函数来解决我的问题,或者如何编写这个问题的查询?

注意:请按照postgres 8.1版本编写解决方案

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-12 11:58:20

使用generate_series()生成具有适当句点的句点和左联接date_time,例如:

代码语言:javascript
运行
复制
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版。你可以试试:

代码语言:javascript
运行
复制
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)    
票数 0
EN

Stack Overflow用户

发布于 2017-06-12 11:39:16

在Postgres中,您可以通过为您的时间段生成所有时间间隔来实现这一点。这有点棘手,因为您必须选择数据中的日期。然而,generate_series()确实很有帮助。

剩下的只是一个left join和聚合:

代码语言:javascript
运行
复制
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;

请注意,这将将期间保留为期间开始的日期/时间。您可以很容易地将其转换为日期和间隔号,如果这更有帮助的话。

票数 0
EN

Stack Overflow用户

发布于 2017-06-12 11:44:14

我认为如果您运行六种不同的查询,因为您知道时间间隔(下限和上限)将更好。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44498385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档