Kijk eens naar de volgende code, als je antwoord op mijn opmerking yes
is :) Sinds je gegevens allemaal in 2012, en de maand november, nam ik de dag.
- SQLFIDDLE voorbeeld
Vraag:
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
;
Resultaten:
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
Gebaseerd op je laatste updates om te vragen. Als je wat per gebruiker per jaar/maand/dag nodig hebt en dan het hoogste vindt, kun je eenvoudig een aggregatiefunctie toevoegen, zoals sum
op bovenstaande vraag. Ik herhaal mezelf, aangezien uw voorbeeldgegevens slechts voor één jaar zijn, is er geen puntengroep per jaar of maand. Daarom nam ik de dag.
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
;
Resultaten gebaseerd op som:
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
BIJGEWERKT MET NIEUWE BRONGEGEVENS VOORBEELD
Simon, kijk eens naar mijn eigen voorbeeld. Omdat je gegevens aan het veranderen waren, heb ik de mijne gebruikt. Hier is de referentie. Ik heb pure ansi
. gebruikt stijl zonder enige over partition
of dense_rank
Merk ook op dat de gegevens die ik heb gebruikt top 2-scores krijgen, niet top 3-scores. U kunt dienovereenkomstig wijzigen.
Raad eens, het antwoord is tien keer eenvoudiger dan de eerste indruk die uw eerste gegevens gaven....
SQLFIDDLE
Vraag naar 1:-- voor top 2 som per gebruiker per 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
;
Resultaten voor vraag 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
Laatste vraag:-- voor alle twee dagen top 2 som per gebruiker
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
;
Eindresultaten:
USERID SUM(SCORE)
1 100
2 47
3 60
Hier volgt een momentopname van directe berekeningen van gegevens die ik heb gebruikt.