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.
- SQLFIDDLE prøve
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.