it-swarm.com.de

Zählen Sie Daten mit mehreren Datumsbereichen

Wahrscheinlich wurde dies schon einmal gefragt, aber ich kann es nicht herausfinden. Ich habe ein phone_clicks table (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);

Diese Tabelle enthält die Anzahl der Telefonklickereignisse für mehrere Branchen-IDs und -Daten.

Ist es möglich, diese Klicks für alle verfügbaren branch_ids mit mehreren Datumsbereichen als Bedingungen zu zählen? Ich möchte diese Ausgabe haben:

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

Ich habe versucht, mit Partition nach Datum zu zählen, bin aber nicht weitergekommen. Ist es möglich, diese Daten in einer Abfrage auszuwählen? Ein zusätzlicher Vorteil wäre die Möglichkeit, frühere Monate als Datumsbereiche anzugeben: heute, gestern, März, Februar, Januar usw.

[~ # ~] update [~ # ~] : Ich habe die Geige aktualisiert, um den aktuellen Monat, die vorherigen Monate und den vorherigen Monat als den zu definieren Datumsbereiche. SQL Fiddle: http://sqlfiddle.com/#!15/855e0/46

Ich verwende PostgreSQL 9.3, aber 9.4-Lösungen sind willkommen, da wir bald darauf migrieren werden.

14
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

Siehe es in deiner SQLFiddle.

8
Andomar

In der Version 9.4 können wir die Klausel FILTER verwenden:

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 ;

Versucht in SQLfiddle .

7
ypercubeᵀᴹ