मैं जो हासिल करने की कोशिश कर रहा हूं: मैं प्रत्येक स्टोर और दिन के घंटे (0 - 24 घंटे) के लिए पिछले 49 दिनों के लिए पंक्तियों की औसत संख्या की गणना करना चाहता हूं।

मैंने अब तक क्या किया है: मेरा वर्तमान एसक्यूएल नीचे है। मैं माध्यिका फ़ंक्शन का गलत उपयोग कर रहा हूं और मुझे निम्न त्रुटि प्राप्त हो रही है: not a single-group group function.

SELECT 
store,
EXTRACT(HOUR FROM CAST(date AS TIMESTAMP)) AS hour_of_day,
median(count(*))

FROM table

WHERE date >= trunc(sysdate - 49) 

GROUP BY 
store,
EXTRACT(HOUR FROM CAST(date AS TIMESTAMP))

मैं क्या जानना चाहता हूं: क्या इस तरह से माध्यिका फलन का उपयोग किया जा सकता है? यदि हां, तो क्या मुझे क्वेरी के समूह द्वारा में कुछ बदलना है? यदि नहीं, तो क्या आप इस समस्या को हल करने का कोई अन्य तरीका सुझा सकते हैं?

0
2602 10 नवम्बर 2020, 15:38

1 उत्तर

सबसे बढ़िया उत्तर

मुझे नहीं पता कि आप इसे विंडो फ़ंक्शंस के साथ कर सकते हैं या नहीं। प्रासंगिक विश्लेषणात्मक कार्य, जैसे median संचयी रूप से कार्य नहीं करते हैं।

लेकिन आप पार्श्व जुड़ाव का उपयोग कर सकते हैं:

with dh as (
      select trunc(date) as dte, extract(hour from date) as hh,
             shop, count(*) as cnt
      from t
     )
select dh.*, m.median_cnt
from dh cross join lateral
     (select median(cnt) as median_cnt
      from dh dh2
      where dh2.hh = dh.hh and
            dh2.dte >= dh.dte - interval '48' day and
            dh2.dte <= dte
     ) m;

नोट: यह स्पष्ट नहीं है कि 49 दिनों से आपका क्या मतलब है। मुझे लगता है कि आप ठीक 7 सप्ताह चाहते हैं जो कि पिछले 48 दिनों में है और साथ ही पंक्ति में वर्तमान तिथि है।

साथ ही, यह 0 मानों की उपेक्षा करता है। यदि आप उन पर ध्यान देना चाहते हैं, तो एक नया प्रश्न पूछें।

1
Gordon Linoff 10 नवम्बर 2020, 12:43