एकाधिक तिथि सीमाओं का उपयोग करके डेटा की गणना करें


14

संभवतः यह पहले भी पूछा जा चुका है, लेकिन मैं इसका पता नहीं लगा सकता। मेरे पास एक phone_clicksमेज है (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);

यह तालिका कई उद्योग_पदों और तिथियों के लिए फ़ोन क्लिक इवेंट काउंट रखती है।

क्या शर्तों के रूप में कई तारीखों के साथ सभी उपलब्ध 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          |
------------------------------------------------

मैंने तारीख तक विभाजन के साथ गिनती का उपयोग करने की कोशिश की है, लेकिन कहीं नहीं मिला। क्या एक क्वेरी में इस डेटा का चयन करना संभव है? अतिरिक्त लाभ तारीख सीमा के रूप में पिछले महीनों को निर्दिष्ट करने में सक्षम होंगे: आज, कल, मार्च, फरवरी, जनवरी, आदि

अद्यतन : मैंने तिथि सीमा के रूप में वर्तमान माह, पिछले महीनों और पूर्व-पिछले महीने को परिभाषित करने के लिए फिडेल को अपडेट किया है। एसक्यूएल फिडल: 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। उस धारणा ने मुझे कई बार जला दिया है
एंडोमर

1
@Andomar, हां, मेरे पास आमतौर पर डेट / डेटाइम / टाइमस्टैम्प प्रश्नों में ओपन-क्लोज्ड रेंज हैं। डेटा प्रकारों में परिवर्तन द्वारा काटे जाने के लिए अधिक कठिन है।
ypercube y
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.