Đếm dữ liệu bằng nhiều phạm vi ngày


14

Có lẽ điều này đã được hỏi trước đây, nhưng tôi không thể tìm ra nó. Tôi có một phone_clicksbảng (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);

Bảng này chứa số lần nhấp vào điện thoại cho nhiều ngành và ngày.

Có thể tính các nhấp chuột này cho tất cả các ngành công nghiệp có sẵn với nhiều phạm vi ngày làm điều kiện không? Tôi muốn có đầu ra này:

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

Tôi đã thử sử dụng đếm với phân vùng theo ngày, nhưng không có nơi nào. Có thể chọn dữ liệu này trong một truy vấn không? Lợi ích bổ sung sẽ có thể chỉ định các tháng trước dưới dạng phạm vi ngày: hôm nay, hôm qua, tháng 3, tháng 2, tháng 1, v.v.

CẬP NHẬT : Tôi đã cập nhật fiddle để xác định tháng hiện tại, tháng trước và tháng trước là phạm vi ngày. Câu đố SQL: http://sqlfiddle.com/#!15/855e0/46

Tôi đang sử dụng PostgreSQL 9.3, nhưng 9,4 giải pháp được hoan nghênh, vì chúng tôi sẽ sớm chuyển sang sử dụng nó.

Câu trả lời:


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

Xem nó trong SQLFiddle của bạn.


7

Trong phiên bản 9.4, chúng tôi sẽ có thể sử dụng FILTERmệnh đề:

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 ;

Đã thử trong SQLfiddle .


Có vẻ tốt hơn nhiều, bộ lọc là đường cú pháp tuyệt vời! Các truy vấn giả định datelà một cột loại datevà không timestamp. Giả định đó đã đốt cháy tôi nhiều lúc
Andomar

1
@Andomar, vâng, tôi thường có phạm vi đóng mở trong các truy vấn ngày / datetime / dấu thời gian. Khó bị cắn hơn bởi những thay đổi trong các loại dữ liệu.
ypercubeᵀᴹ 19/03/2015
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.