2017-06-12 50 views
0

我正在使用postgres 8.1數據庫,我想寫一個查詢,間隔4小時選擇數據。選擇間隔4小時取數據的查詢

因此,作爲形象展示subscriber_id與日期,這可如何目前數據庫中的數據和

enter image description here

我要像

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版本

回答

0

使用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)  
+0

generate_series不適用於postgres 8.1版本 –

0

在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; 

注意,這保持期爲週期的開始的日期/時間。您可以隨時將其轉換爲日期和間隔號碼,如果這更有幫助。

+0

感謝答案,查詢的混亂一點,你可以請編輯和打開和列名subscriberid使用表名 –

+0

@KushalJain:戈登可能會做,如果你已發佈示例數據作爲**文本**可以複製,而不是作爲[屏幕截圖](http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-代碼的時候,問一個問題/ 285557) –

+0

是的,但有人可以這樣做。它真的不瞭解我,這是可變的,這是列 –

0

我想如果你運行六個不同的查詢,因爲你知道時間間隔(上限和下限)會更好。