Pokud je vaše odpověď na můj komentář yes
, podívejte se prosím na následující kód :) Od vašich dat v roce 2012 a měsíci listopadu jsem si vzal den.
- SQLFIDDLE ukázka
Dotaz:
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
;
Výsledky:
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 základě vašich posledních aktualizací otázky. Pokud potřebujete nějaké na uživatele podle roku/měsíce/den a pak najdete nejvyšší, můžete jednoduše přidat agregační funkci jako sum
na výše uvedený dotaz. Opakuji se, protože vaše ukázková data jsou pouze za jeden rok, neexistuje žádná bodová skupina podle roku nebo měsíce. Proto jsem si vzal den.
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
;
Výsledky založené na součtu:
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
AKTUALIZOVÁNO O NOVÝ VZORK ZDROJOVÝCH DAT
Simone, prosím, podívej se na můj vlastní vzorek. Jak se vaše data měnila, použil jsem moje. Zde je odkaz. Použil jsem čistý ansi
styl bez over partition
nebo dense_rank
.Také si všimněte, že data, která jsem použil, dostávají první 2, nikoli top 3 skóre. Podle toho můžete změnit.
Hádejte co, odpověď je 10krát jednodušší než první dojem, který vyvolala vaše první data...
SQLFIDDLE
Dotaz na 1:-- na nejvyšší 2 součet uživatelem za každý den
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
;
Výsledky pro dotaz 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
Závěrečný dotaz:-- za všechny dva dny součet horních 2 podle uživatele
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
;
Konečné výsledky:
USERID SUM(SCORE)
1 100
2 47
3 60
Zde je snímek přímých výpočtů dat, které jsem použil.