कृपया निम्नलिखित कोड पर एक नज़र डालें, यदि मेरी टिप्पणी का आपका उत्तर yes
है :) चूंकि आपका डेटा 2012 में, और नवंबर के महीने में, मैंने दिन लिया।
- SQLFIDDLE नमूना
प्रश्न:
select y.id, y.userid, y.score, y.datestamp
from (select id, userid, score, datestamp
from scores
group by day(datestamp)) as y
where (select count(*)
from (select id, userid, score, datestamp
from scores group by day(datestamp)) as x
where y.score >= x.score
and y.userid = x.userid
) =1 -- Top 3rd, 2nd, 1st
order by y.score desc
;
परिणाम:
ID USERID SCORE DATESTAMP
8 2 8.5 December, 07 2012 00:00:00+0000
20 3 6 December, 08 2012 00:00:00+0000
1 1 5 December, 06 2012 00:00:00+0000
प्रश्न के आपके बाद के अपडेट के आधार पर। यदि आपको वर्ष/माह/दिन के हिसाब से प्रति उपयोगकर्ता कुछ चाहिए और फिर उच्चतम पाएं, तो आप बस sum
जैसे एकत्रीकरण फ़ंक्शन जोड़ सकते हैं उपरोक्त क्वेरी के लिए। मैं खुद को फिर से दोहरा रहा हूं, क्योंकि आपका नमूना डेटा सिर्फ एक वर्ष के लिए है, साल या महीने के हिसाब से कोई बिंदु समूह नहीं है। इसलिए मैंने दिन लिया।
select y.id, y.userid, y.score, y.datestamp
from (select id, userid, sum(score) as score,
datestamp
from scores
group by userid, day(datestamp)) as y
where (select count(*)
from (select id, userid, sum(score) as score
, datestamp
from scores
group by userid, day(datestamp)) as x
where y.score >= x.score
and y.userid = x.userid
) =1 -- Top 3rd, 2nd, 1st
order by y.score desc
;
योग के आधार पर परिणाम:
ID USERID SCORE DATESTAMP
1 1 47.5 December, 06 2012 00:00:00+0000
8 2 16 December, 07 2012 00:00:00+0000
20 3 6 December, 08 2012 00:00:00+0000
नए स्रोत डेटा नमूने के साथ अपडेट किया गया
साइमन, कृपया मेरे अपने नमूने पर एक नज़र डालें। जैसे-जैसे आपका डेटा बदल रहा था, मैंने अपना इस्तेमाल किया। ये रहा संदर्भ। मैंने शुद्ध ansi
. का उपयोग किया है बिना किसी over partition
के शैली या dense_rank
यह भी ध्यान दें कि मैंने जो डेटा इस्तेमाल किया है, वह शीर्ष 2 नहीं शीर्ष 3 अंक प्राप्त कर रहा है। आप तदनुसार बदल सकते हैं।
लगता है क्या, आपके पहले डेटा द्वारा दिए गए पहले प्रभाव की तुलना में उत्तर 10 गुना आसान है....
SQLFIDDLE
प्रश्न 1:-- प्रत्येक दिन उपयोगकर्ता द्वारा शीर्ष 2 राशि के लिए
SELECT userid, sum(Score), datestamp
FROM scores t1
where 2 >=
(SELECT count(*)
from scores t2
where t1.score <= t2.score
and t1.userid = t2.userid
and day(t1.datestamp) = day(t2.datestamp)
order by t2.score desc)
group by userid, datestamp
;
क्वेरी 1 के लिए परिणाम:
USERID SUM(SCORE) DATESTAMP
1 70 December, 06 2012 00:00:00+0000
1 30 December, 07 2012 00:00:00+0000
2 22 December, 06 2012 00:00:00+0000
2 25 December, 07 2012 00:00:00+0000
3 30 December, 06 2012 00:00:00+0000
3 30 December, 07 2012 00:00:00+0000
अंतिम प्रश्न:-- सभी दो दिनों के लिए उपयोगकर्ता द्वारा शीर्ष 2 योग
SELECT userid, sum(Score)
FROM scores t1
where 2 >=
(SELECT count(*)
from scores t2
where t1.score <= t2.score
and t1.userid = t2.userid
and day(t1.datestamp) = day(t2.datestamp)
order by t2.score desc)
group by userid
;
अंतिम परिणाम:
USERID SUM(SCORE)
1 100
2 47
3 60
मेरे द्वारा उपयोग किए गए डेटा की प्रत्यक्ष गणना का एक स्नैपशॉट यहां दिया गया है।