여러 날짜 범위를 사용하여 데이터 계산


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_id 및 날짜에 대한 전화 클릭 이벤트 수가 있습니다.

기간이 여러 개인 사용 가능한 모든 industry_id에 대한 클릭을 조건으로 계산할 수 있습니까? 이 출력을 갖고 싶습니다 :

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

날짜별로 파티션으로 계산을 시도했지만 아무데도 없습니다. 하나의 쿼리에서이 데이터를 선택할 수 있습니까? 오늘, 어제, 3 월, 2 월, 1 월 등의 날짜 범위로 이전 달을 지정할 수 있다는 추가 이점이 있습니다.

업데이트 : 현재 달, 이전 달 및 이전 달을 날짜 범위로 정의하기 위해 바이올린을 업데이트했습니다. SQL 피들 : 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. 그 가정은 때때로 나를 불 태웠다
Andomar

1
@Andomar, 그렇습니다. 일반적으로 날짜 / 날짜 / 시간 스탬프 쿼리에서 열린 범위가 있습니다. 데이터 유형의 변경으로 물기가 더 어렵습니다.
ypercubeᵀᴹ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.