मैं अलग पहचान के लिए एक विभाजन के रूप में हर हफ्ते के साथ प्रति दिन उपयोगकर्ता आईडी लॉग की एक अलग गिनती प्राप्त करने की कोशिश कर रहा हूँ। जैसे यदि एक उपयोगकर्ता सप्ताह 1 के शुक्रवार/शनिवार को और सप्ताह 2 के सोमवार/शुक्रवार को लॉग इन करता है, तो मैं एक कॉलम रखना चाहता हूं जो शुक्रवार में 1 और शनिवार सप्ताह 1 में 0 और सोमवार में 1 और शुक्रवार सप्ताह 2 में गिनता है।

अगर मेरे पास निम्न डेटा है:

https://i.stack.imgur.com/COf69.png

मुझे इस परिणाम की उम्मीद है:

https://i.stack.imgur.com/kTRdu.png

मैं प्रेस्टो के साथ काम कर रहा हूं, और घने_रैंक() समाधानों के साथ प्रयास किया है लेकिन इसका कोई फायदा नहीं हुआ है।

1
L.Alon 2 नवम्बर 2020, 00:43

1 उत्तर

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

आप विंडो फ़ंक्शंस और एकत्रीकरण का उपयोग कर सकते हैं:

select date, iso_week, sum(case when rn = 1 then 1 else 0 end) cnt
from (
    select t.*, 
        row_number() over(partition by userid, iso_week order by date) min_date
    from mytable t
) t
group by date, iso_week

बेहतर अभी तक, मानक where क्लॉज को एग्रीगेट करने के लिए इस्तेमाल करना बेहतर है फ़ंक्शंस, जो प्रेस्टो का समर्थन करता है:

select date, iso_week, count(*) filter(where rn = 1) cnt
from (
    select t.*, 
        row_number() over(partition by userid, iso_week order by date) min_date
    from mytable t
) t
group by date, iso_week
1
Piotr Findeisen 2 नवम्बर 2020, 20:52