Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

प्रत्येक उपयोगकर्ता के लिए प्रत्येक दिन में उच्चतम 3 स्कोर चुनें

कृपया निम्नलिखित कोड पर एक नज़र डालें, यदि मेरी टिप्पणी का आपका उत्तर yes है :) चूंकि आपका डेटा 2012 में, और नवंबर के महीने में, मैंने दिन लिया।

प्रश्न:

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

मेरे द्वारा उपयोग किए गए डेटा की प्रत्यक्ष गणना का एक स्नैपशॉट यहां दिया गया है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. समाप्त जावा प्रोजेक्ट, अब जार या .exe फ़ाइल (डेटाबेस के साथ) बना रहा है

  2. mysql कस्टम वैश्विक परिभाषित चर

  3. क्या कुल MySQL फ़ंक्शन हमेशा एक पंक्ति लौटाते हैं?

  4. MySql कॉलम नाम के रूप में गतिशील पंक्ति मानों का चयन करें

  5. MySQL में कल की तारीख कैसे प्राप्त करें