sql >> Databáze >  >> RDS >> Mysql

Vyberte nejvyšší 3 skóre v každém dni pro každého uživatele

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.

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.



  1. Spojte dva sloupce a přidejte je do jednoho nového sloupce

  2. RU nebo RUR?

  3. Relační databáze

  4. Výjimka PDO „nelze najít ovladač“ v php