Menghitung data menggunakan beberapa rentang tanggal

14

Mungkin ini sudah ditanyakan sebelumnya, tetapi saya tidak bisa mengetahuinya. Saya punya phone_clicksmeja (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);

Tabel ini memuat jumlah acara klik telepon untuk beberapa industri_id dan tanggal.

Apakah mungkin untuk menghitung klik ini untuk semua industry_ids yang tersedia dengan beberapa rentang tanggal sebagai ketentuan? Saya ingin memiliki hasil ini:

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

Saya sudah mencoba menggunakan penghitungan dengan partisi berdasarkan tanggal, tetapi tidak berhasil. Apakah mungkin untuk memilih data ini dalam satu permintaan? Manfaat tambahan akan dapat menentukan bulan sebelumnya sebagai rentang tanggal: hari ini, kemarin, Maret, Februari, Januari, dll

UPDATE : Saya telah memperbarui biola untuk menentukan bulan saat ini, bulan-bulan sebelumnya dan bulan pra-sebelumnya sebagai tanggal berkisar. SQL Fiddle: http://sqlfiddle.com/#!15/855e0/46

Saya menggunakan PostgreSQL 9.3, tetapi solusi 9.4 dipersilahkan, karena kami akan segera bermigrasi ke sana.

Valentin Vasilyev
sumber

Jawaban:

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

Lihat di SQLFiddle Anda.

Andomar
sumber
7

Dalam versi 9.4, kita akan dapat menggunakan FILTERklausa:

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 ;

Mencoba dalam SQLfiddle .

ypercubeᵀᴹ
sumber
Terlihat lebih baik, filter gula sintaksis yang hebat! Permintaan mengasumsikan dateadalah kolom tipe datedan bukan timestamp. Asumsi itu telah membakar saya pada waktu
Andomar
1
@Andomar, ya, saya biasanya memiliki rentang buka-tutup di kueri tanggal / datetime / timestamp. Lebih sulit digigit oleh perubahan tipe data.
ypercubeᵀᴹ