Моля, разгледайте следния код, ако отговорът ви на моя коментар е yes
:) Тъй като данните ви са всички през 2012 г. и месец ноември, взех ден.
- SQLFIDDLE проба
Запитване:
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
Ето моментна снимка на директните изчисления на използваните от мен данни.