आपको एग्रीगेट फ़ंक्शन
पर गौर करना चाहिए (न्यूनतम, अधिकतम, गणना, औसत), जो GROUP BY
. दिनांक-आधारित एकत्रीकरण के लिए, date_trunc
उपयोगी भी है।
उदाहरण के लिए, यह प्रति दिन पंक्तियों की संख्या लौटाएगा:
SELECT date_trunc('day', date_time) AS day_start,
COUNT(id) AS user_count FROM tb_user
GROUP BY date_trunc('day', date_time);
फिर आप कुछ इस तरह का उपयोग करके दैनिक औसत कर सकते हैं (एक सीटीई के साथ ):
WITH daily_count AS (SELECT date_trunc('day', date_time) AS day_start,
COUNT(id) AS user_count FROM tb_user
GROUP BY date_trunc('day', date_time))
SELECT AVG(user_count) FROM daily_count;
'week'
का प्रयोग करें साप्ताहिक गणना के लिए दिन के बजाय, इत्यादि (देखें date_trunc
दस्तावेज़ीकरण)।
संपादित करें: (निम्नलिखित टिप्पणी:5/1/2012 तक औसत और इसमें शामिल हैं, यानी 6 तारीख से पहले।)
WITH daily_count AS (SELECT date_trunc('day', date_time) AS day_start,
COUNT(id) AS user_count
FROM tb_user
WHERE date_time >= DATE('2012-01-01') AND date_time < DATE('2012-01-06')
GROUP BY date_trunc('day', date_time))
SELECT SUM(user_count)/(DATE('2012-01-06') - DATE('2012-01-01')) FROM daily_count;
इस मामले में जो ऊपर है वह अति-जटिल है। यह आपको वही परिणाम देगा:
SELECT COUNT(id)/(DATE('2012-01-06') - DATE('2012-01-01'))
FROM tb_user
WHERE date_time >= DATE('2012-01-01') AND date_time < DATE('2012-01-06');
संपादित करें 2: आपके संपादन के बाद, मुझे लगता है कि आप जो चाहते हैं वह आपके डेटाबेस के अस्तित्व की पूरी अवधि के लिए केवल एक वैश्विक औसत है, न कि महीने/सप्ताह/दिन के समूहों के आधार पर।
इससे आपको प्रतिदिन पंक्तियों की औसत संख्या मिलनी चाहिए:
WITH total_min_max AS (SELECT
COUNT(id) AS total_visits,
MIN(date_time) AS first_date_time,
MAX(date_time) AS last_date_time,
FROM tb_user)
SELECT total_visits/((last_date_time::date-first_date_time::date)+1) AS users_per_day
FROM total_min_max
(मैं last_date_time
को बदल दूंगा NOW()
के साथ यदि हाल ही में कोई विज़िट नहीं हुई है, तो अंतिम विज़िट तक के बजाय अब तक के समय के साथ औसत बनाने के लिए।)
फिर, दैनिक, साप्ताहिक और "मासिक" के लिए:
WITH daily_avg AS (
WITH total_min_max AS (SELECT
COUNT(id) AS total_visits,
MIN(date_time) AS first_date_time,
MAX(date_time) AS last_date_time,
FROM tb_user)
SELECT total_visits/((last_date_time::date-first_date_time::date)+1) AS users_per_day
FROM total_min_max)
SELECT
users_per_day,
(users_per_day * 7) AS users_per_week,
(users_per_month * 30) AS users_per_month
FROM daily_avg
ऐसा कहा जा रहा है, ऐसे आँकड़ों से आप जो निष्कर्ष निकालते हैं वह बहुत अच्छा नहीं हो सकता है, खासकर यदि आप यह देखना चाहते हैं कि यह कैसे बदलता है।
मैं एक महीने में 30 दिन मानने के बजाय प्रति दिन डेटा को भी सामान्य कर दूंगा (यदि प्रति घंटा नहीं, क्योंकि सभी दिनों में 24 घंटे नहीं होते हैं ) मान लें कि आपके पास जनवरी 2011 में प्रति दिन 10 विज़िट और फरवरी 2011 में प्रति दिन 10 विज़िट हैं। इससे आपको जनवरी में 310 विज़िट और फरवरी में 280 विज़िट मिलती हैं। यदि आप ध्यान नहीं देते हैं, तो आप सोच सकते हैं कि आपने लगभग एक आगंतुकों की संख्या में 10% की गिरावट, इसलिए फरवरी में कुछ गलत हुआ, जबकि वास्तव में ऐसा नहीं है।