2016-07-07 4 views
5

मैं एक जटिल समस्या यह है कि पहली नजर में तुच्छ हो रहा है है:मेरे पास 9 0 दिन की खिड़की पर कितने अलग सक्रिय उपयोगकर्ता थे?

    किसी दिए गए 90 दिन खिड़की के लिए
  • , मैं कितने अलग सक्रिय उपयोगकर्ताओं है?

तालिका मैं इसे क्वेरी करने के लिए उपयोग करूँगा लॉगिन तालिका (रेडशिफ्ट में होस्ट की गई) है, और इसमें लॉग इनटाइम के साथ टाइमस्टैम्प है और उपयोगकर्ता पहचानकर्ता के रूप में उपयोग किया गया है।

जब भी मैं एक दिन के लिए इस उत्तर देना चाहते हैं, तो क्वेरी आसान और सीधा है:

select count (distinct usertoken) 
from logins 
where datediff('d',logintime,getdate()) <= 90 

समस्या जटिल हो जाता है, क्योंकि मैं हर दी गई तारीख के लिए संख्या के साथ तालिका में यह करना चाहते हैं।

07/07 100k 
07/06 98k 
07/05 99k 
07/04 101k 

(...)

विंडो कार्यों मेरी मदद नहीं करते, क्योंकि मैं अलग गिनती करने के लिए की जरूरत है, और यह एक खिड़की समारोह में संभव नहीं है।

मेरे ज्ञान के लिए, SQL क्वेरी में पुन: प्रयास करने का कोई तरीका नहीं है।

मुझे इसके बारे में कैसे जाना चाहिए?

+0

कृपया प्रत्येक दी गई तारीख 'पर विस्तृत करें। क्या आप समय सीमा के लिए निचले और ऊपरी बाउंड पास करते हैं? या यादृच्छिक तिथियों की एक सरणी? क्या एक ही उपयोगकर्ता के लिए उसी दिन डुप्लिकेट प्रविष्टियां हो सकती हैं? आपकी मेज कितनी बड़ी है? पंक्तियों की संख्या? प्रति पंक्ति/तालिका परिभाषा बाइट्स। –

उत्तर

0

तुच्छ तरीका बहुत computationally महंगा है:

select days.d, count(distinct l.userid) 
from (select distinct date_trunc('day', logintime) as d 
     from logins l 
    ) days left join 
    (select distinct userid, date_trunc('day', logintime) as d 
     from logins 
    ) l 
    on datediff('d', l.d, days.d) between 0 and 89 
group by days.d 
order by days.d; 
+0

क्या आपको '0 और 9 0' (या संभवतः 89 के बीच) कहना नहीं है? अंतर नकारात्मक हो सकता है। – shawnt00

0

शायद मैं कुछ याद आ रही है, लेकिन मैं क्या समझ से इस करना चाहिए:

- एसक्यूएल सर्वर में

चयन डाली (तिथि के रूप में logintime), लॉग इन से गिनती (विशिष्ट usertoken) जहां datediff (डी, logintime, getdate()) < = 90 समूह कास्ट (लॉगिन समय की तारीख के रूप में)

PostgreSQL डाली बदलें में

) DateDiff ('प' के लिए (trunc_Date (दिन, logintime) और DateDiff (डी, logintime, getdate (करने के लिए logintime तिथि के रूप में)), logintime, getdate ())

0

मुझे लगता है कि यदि किसी दिन में शून्य उपयोगकर्ता लॉग इन करते हैं तो आपको सूची में यह दिखाने में कोई फर्क नहीं पड़ता।

सबसे पहले हमें उन सभी दिनों का एक सेट मिलता है जिनकी हम परवाह करते हैं और "दिन" सेट करते हैं।

with days as (
    select date_trunc('day', date) as day from logins 
    where date > now() - '90 days'::interval 
    group by day 
    ) 

फिर हम लॉग इन के साथ सेट दिनों में शामिल हो जाते हैं।

select day, count(distinct userid) 
from days 
join logins on date_trunc('day', logins.date) = days.day 
group by day 
order by day 
संबंधित मुद्दे