Підраховуйте дані, використовуючи кілька діапазонів дат


14

Напевно, про це і питали раніше, але я не можу цього зрозуміти. У мене є phone_clicksтаблиця (sql скрипка 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_ids та дат.

Чи можна вважати ці кліки для всіх доступних industry_ids з кількома діапазонами дат як умови? Я хотів би мати такий результат:

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

Я намагався використовувати підрахунок з розділом за датою, але ніде не потрапив. Чи можливо вибрати ці дані в одному запиті? Додатковою перевагою було б можливість визначати попередні місяці як діапазони дат: сьогодні, вчора, березня, лютого, січня тощо

ОНОВЛЕННЯ : Я оновив скрипку, щоб визначити поточний місяць, попередні місяці та попередній місяць як діапазони дат. SQL Fiddle: 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стовпець типу, dateа не timestamp. Це припущення часом спалювало мене
Андомар

1
@ Случайно, так, у мене зазвичай є відкриті закриті діапазони запитів date / datetime / timetamp. Складніше бути укушеним змінами у типах даних.
ypercubeᵀᴹ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.