2010-01-11 9 views
16

पर सशर्त रूप से योग करने के लिए SQL क्वेरी मेरे उपयोगकर्ताओं पर कुछ स्लाइडिंग विंडो आंकड़े जानने का प्रयास कर रहा है। मेरे पास एक उपयोगकर्ता के साथ एक टेबल है, और स्तंभ_डेट और सत्यापित_ट जैसे कॉलम हैं। प्रत्येक महीने के लिए, मैं यह जानना चाहता हूं कि कितने उपयोगकर्ता पंजीकृत हैं (create_at के date_trunc द्वारा एक साधारण समूह), और फिर उन लोगों के बारे में, मेरी स्लाइडिंग विंडो में कितने सत्यापित हैं (इसे 60 दिन कॉल करें)।चलती दिनांक विंडो

Month | Registered | Verified in 60 days 
Jan 2009 | 1543  | 107 
Feb 2009 | 2000  | 250 

मैं PostgreSQL उपयोग कर रहा हूँ:

मैं एक SQL क्वेरी कि मेरे जैसे कुछ देता है क्या करना चाहते हैं। मैं योग (केस ...) को देखना शुरू कर रहा हूं, लेकिन मुझे नहीं पता कि मैं अपने मामले को date_trunc पर निर्भर करता हूं या नहीं।

SELECT DATE_TRUNC('month', created_at) as month, 
COUNT(*) as registered, 
SUM(CASE WHEN verified_at < month+60 THEN 1 ELSE 0 END) as verified 
FROM users 
GROUP BY DATE_TRUNC('month', created_at) 
+0

PostgreSQL का कौन सा संस्करण उपयोग करते हैं? –

+0

मैं 8.3.5 – teich

उत्तर

21
SELECT COUNT(created_at) AS registered, 
     SUM(CASE WHEN verified_at <= created_at + '60 day'::INTERVAL THEN 1 ELSE 0 END) AS verified 
FROM generate_series(1, 20) s 
LEFT JOIN 
     users 
ON  created_at >= '2009-01-01'::datetime + (s || ' month')::interval 
     AND created_at < '2009-01-01'::datetime + (s + 1 || ' month')::interval 
GROUP BY 
     s 
+0

यह कमाल है। मैं श्रृंखला को छोड़कर घायल हो गया हूं, और उपर्युक्त कोड में अपने अंतराल का उपयोग कर रहा हूं, जो बहुत अच्छा काम करता है। – teich

+0

'@ teich': श्रृंखला सुनिश्चित करें कि किसी भी महीने के लिए कोई उपयोगकर्ता नहीं होने पर कोई अंतराल नहीं छोड़ा जाता है। – Quassnoi

0

शायद आप कर सकते थे संघ एक साथ अलग अलग महीनों:

यह काम नहीं करता है, ज़ाहिर है, लेकिन यहाँ विचार है।

select sum(whatever), 'january' from user where month = 'january' 
union all 
select sum(whatever), 'february' from user where month = 'february' 
... 
+0

का उपयोग कर रहा हूं कुंजी यह है कि मैं SQL क्वेरी में महीनों को सूचीबद्ध नहीं करना चाहता, क्योंकि मुझे नहीं पता कि मुझे कितने महीने मिल गए हैं। यह एक प्रश्न है जो हर दिन चलाएगा, महीनों (या साल!) के रूप में नया डेटा आता है। – teich

0
SELECT 
    MONTH, 
    COUNT(*) AS Registered, 
    SUM (CASE WHEN datediff(day,reg_date,ver_date) < 60 THEN 1 ELSE 0) as 'Verified in 60 //days datediff is an MSSQL function amend for postgresql' 
FROM 
    TABLE 
GROUP BY 
    MONTH 
संबंधित मुद्दे