2017-06-12 17 views
0

私はpostgres 8.1データベースを使用しており、4時間の間隔でデータを選択するクエリを作成したいと思います。だから、日付の画像を表示するSUBSCRIBER_IDとして4時間間隔でデータを取得するためのクエリの選択

、この方法を現在のデータ利用可能なデータベース内と

enter image description here

私は、我々は24時間を持っている毎日では基本的に

No. of Subscriber | Interval 
     0    0-4 
     0    4-8 
     7    8-12 
     1    12-16 
     0    16-20 
     0    20-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

に応じたソリューションを記述してください、あなたの時間の期間のすべての間隔を生成することによって、これを行うことができます。あなたのデータの日付を選ぶ必要があるので、これはややこしいことです。しかし、generate_series()は本当に役に立ちます。これは期間の初めの日付/時刻と期間を保持していること

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; 

注:

残りはちょうどleft joinと集計です。これはもっと便利な場合は、これを日付と区間番号に簡単に変換することができます。

+0

おかげで、クエリは、あなたがそれを編集して開き、列名は - サブスクライバとしてテーブル名を使用してくださいすることができ、混乱の少しです –

+0

@KushalJain:ゴードンはおそらく行っているでしょうあなたが投稿していた場合にサンプルデータは**テキスト**としてコピーでき、[スクリーンショット]ではありません(http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of- code-on-so-asking-a-question/285557) –

+0

はい、しかし誰かがそれを行うことができます。それは実際に私には理解できません。これは可変であり、列です –

0

時間間隔(下限と上限)が優れていることが分かっているので、6つの異なるクエリを実行すると思います。

関連する問題