sql >> Database teknologi >  >> RDS >> Mysql

Vælg de højeste 3 scores på hver dag for hver bruger

Tag et kig på følgende kode, hvis dit svar på min kommentar er yes :) Siden dine data alle i 2012, og november måned, tog jeg dag.

Forespørgsel:

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
;

Resultater:

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

Baseret på dine sidstnævnte opdateringer til spørgsmålet. Hvis du har brug for nogle pr. bruger efter år/måned/dag og derefter finder det højeste, kan du blot tilføje aggregeringsfunktion som sum til ovenstående forespørgsel. Jeg gentager mig selv, da dine prøvedata kun er for et år, er der ingen pointgruppe efter år eller måned. Det er derfor, jeg tog dagen.

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
;

Resultater baseret på sum:

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

OPDATERET MED NY KILDEDATAPRØVE

Simon, tag et kig på min egen prøve. Da dine data var ved at ændre sig, brugte jeg mine.Her er referencen. Jeg har brugt ren ansi stil uden nogen over partition eller dense_rank Bemærk også, at de data, jeg brugte, får top 2 ikke top 3 scores. Du kan ændre er i overensstemmelse hermed.

Gæt hvad, svaret er 10 gange enklere end det første indtryk, dine første data gav...

SQLFIDDLE

Forespørgsel til 1:-- for top 2 sum efter bruger pr. dag

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 
;

Resultater for forespørgsel 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

Endelig forespørgsel:-- for alle to dage top 2 sum af bruger

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
;

Endelige resultater:

USERID  SUM(SCORE)
1      100
2      47
3      60

Her kommer et øjebliksbillede af direkte beregninger af data, jeg brugte.



  1. Xampp MS SQL server PHP 5.6

  2. Hurtigste måde at opdatere en MySQL-tabel på, hvis rækken findes, ellers indsæt. Mere end 2 ikke-unikke nøgler

  3. Hvor kan jeg finde filen my.ini til Windows mysql server?

  4. PDO-ækvivalent til mysql_num_rows eller mssql_num_rows