Proszę spojrzeć na poniższy kod, jeśli Twoja odpowiedź na mój komentarz brzmi yes
:) Ponieważ twoje dane były wszystkie w 2012 roku i miesiącu listopadzie, wziąłem dzień.
- SQLFIDDLE próbka
Zapytanie:
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
;
Wyniki:
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
Na podstawie ostatnich aktualizacji pytania. Jeśli potrzebujesz kilku na użytkownika w ujęciu rok/miesiąc/dzień, a następnie znajdziesz najwyższą, możesz po prostu dodać funkcję agregacji, taką jak sum
do powyższego zapytania. Powtarzam się, ponieważ twoje przykładowe dane dotyczą tylko jednego roku, nie ma grupowania punktów według roku lub miesiąca. Dlatego wziąłem dzień.
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
;
Wyniki na podstawie sumy:
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
ZAKTUALIZOWANO NOWĄ PRÓBKĄ DANYCH ŹRÓDŁOWYCH
Simon, spójrz proszę na moją własną próbkę. Ponieważ twoje dane się zmieniały, użyłem mojego. Oto odniesienie. Użyłem czystego ansi
styl bez over partition
lub dense_rank
. Zwróć też uwagę, że dane, których użyłem, uzyskują najlepsze 2, a nie 3 najlepsze wyniki. Możesz odpowiednio zmienić.
Zgadnij, odpowiedź jest 10 razy prostsza niż pierwsze wrażenie, jakie dały Twoje pierwsze dane....
SQLFIDDLE
Zapytanie do 1:-- dla 2 najlepszych sum według użytkownika każdego dnia
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
;
Wyniki dla zapytania 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
Zapytanie końcowe:-- za wszystkie dwa dni najwyższa suma 2 według użytkownika
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
;
Wyniki końcowe:
USERID SUM(SCORE)
1 100
2 47
3 60
Oto migawka bezpośrednich obliczeń danych, których użyłem.