นับข้อมูลโดยใช้ช่วงวันที่หลายช่วง


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          |
------------------------------------------------

ฉันลองใช้การนับด้วยพาร์ติชันตามวันที่ แต่ไม่ได้ไปไหน เป็นไปได้หรือไม่ที่จะเลือกข้อมูลนี้ในการสืบค้นเดียว? สิทธิประโยชน์เพิ่มเติมจะสามารถระบุเดือนก่อนหน้าเป็นช่วงวันที่: วันนี้, เมื่อวาน, มีนาคม, กุมภาพันธ์, มกราคม, ฯลฯ

UPDATE : ฉันได้อัพเดทซอเพื่อกำหนดเดือนปัจจุบันเดือนก่อนหน้าและเดือนก่อนหน้าเป็นช่วงวันที่ ซอ Fiddle: http://sqlfiddle.com/#!15/855e0/46

ฉันใช้ PostgreSQL 9.3 แต่ยินดีต้อนรับโซลูชั่น 9.4 เพราะเราจะทำการโยกย้ายไปในไม่ช้า

คำตอบ:



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.