Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wybierz najwyższe 3 wyniki każdego dnia dla każdego użytkownika

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ń.

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. posortuj zestawienie w grupie według

  2. SQL ustawia wartości jednej kolumny równe wartościom innej kolumny w tej samej tabeli

  3. Utwórz wstawkę... Wybierz instrukcję w Laravel

  4. Zwracanie zapytania w formacie wierszowym zamiast kolumnowym

  5. usługi parzenia:gdzie edytować konfigurację?