Zählen Sie Daten mithilfe mehrerer Datumsbereiche

14

Wahrscheinlich wurde das schon einmal gefragt, aber ich kann es nicht herausfinden. Ich habe einen phone_clicksTisch (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.

Können diese Klicks für alle verfügbaren Branchen-IDs mit mehreren Datumsbereichen als Bedingungen gezählt werden? 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 der 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, frühere Monate als Datumsbereiche angeben zu können: 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 Datumsbereiche zu definieren. 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.

Valentin Vasilyev
quelle

Antworten:

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

Sehen Sie es in Ihrem SQLFiddle.

Andomar
quelle
7

In Version 9.4 können wir die folgende FILTERKlausel 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 .

ypercubeᵀᴹ
quelle
Sieht viel besser aus, Filter ist großartiger syntaktischer Zucker! Bei der Abfrage wird davon ausgegangen, dass datees sich um eine Spalte vom Typ dateund nicht um eine Spalte vom Typ handelt timestamp. Diese Annahme hat mich manchmal verbrannt
Andomar
1
@Andomar, ja, ich habe normalerweise offene und geschlossene Bereiche für Datums- / Datums- / Zeitstempelabfragen. Es ist schwieriger, von Änderungen der Datentypen gebissen zu werden.
ypercubeᵀᴹ