複数の日付範囲を使用してデータをカウントする


14

おそらくこれは以前に尋ねられたことがありますが、私にはわかりません。phone_clicksテーブルがあります(sql fiddle http://sqlfiddle.com/#!15/855e0/1

CREATE TABLE phone_clicks (
    id integer NOT NULL,
    date date NOT NULL,
    industry_id integer NOT NULL,
    clicks integer DEFAULT 0 NOT NULL
);

insert into phone_clicks(id, date, industry_id, clicks)
values
(1, '2015-03-16', 1, 15),
(2, '2015-03-16', 2, 7),
(3, '2015-03-16', 3, 0),
(4, '2015-03-17', 1, 12),
(5, '2015-03-17', 3, 4),
(6, '2015-03-17', 4, 22),
(7, '2015-03-18', 1, 19),
(8, '2015-03-18', 2, 35);

このテーブルには、複数のindustry_idと日付の電話クリックイベントカウントが保持されます。

複数の日付範囲を持つすべての利用可能なindustry_idのこれらのクリックを条件としてカウントすることはできますか?この出力が欲しいです:

------------------------------------------------
industry_id |  today | yesterday | last 3 days |
------------------------------------------------
1           |  19    | 12        | 46          |
------------------------------------------------
2           |  35    | 0         | 42          |
------------------------------------------------
3           |  0     | 4         | 4           |
------------------------------------------------
4           |  0     | 22        | 22          |
------------------------------------------------

日付によるパーティションでカウントを使用しようとしましたが、どこにも行きませんでした。1つのクエリでこのデータを選択することはできますか?追加の利点は、今日、昨日、3月、2月、1月など、前の月を日付範囲として指定できることです。

更新:現在の月、前の月、前の月を日付範囲として定義するためにフィドルを更新しました。SQLフィドル:http ://sqlfiddle.com/#!15/855e0/ 46

PostgreSQL 9.3を使用していますが、まもなく移行するため、9.4ソリューションは大歓迎です。

回答:


8
select  industry_id
,       sum(case when current_date <= date then clicks end) as today 
,       sum(case when current_date-1 <= date and
                      date < current_date then clicks end) as yesterday
,       sum(case when current_date-4 <= date and 
                      date < current_date-1 then clicks end) as last3days
from    phone_clicks
group by
        industry_id

SQLFiddleで確認してください。


7

9.4バージョンでは、次のFILTER句を使用できます。

select  
    t.industry_id,
    sum(t.clicks) filter (where t.date = current_date) 
        as today,
    sum(t.clicks) filter (where t.date = current_date - interval '1 day')
        as yesterday,
    sum(t.clicks) filter (where t.date >= current_date - interval '2 days'
                            and t.date <= current_date) 
        as last_3_days
from 
    phone_clicks as t
group by 
    t.industry_id ;

SQLfiddleで試しました。


見た目はずっと良く、フィルターは素晴らしい構文糖衣です!クエリは、ではなくdate型の列であると想定しています。その仮定はdatetimestamp
時々

1
@Andomar、はい、私は通常、日付/日付時刻/タイムスタンプのクエリに開閉範囲を持っています。データ型の変更に噛まれにくい。
ypercubeᵀᴹ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.