Mysql
 sql >> база данни >  >> RDS >> Mysql

Изберете най-високите 3 резултата всеки ден за всеки потребител

Моля, разгледайте следния код, ако отговорът ви на моя коментар е yes :) Тъй като данните ви са всички през 2012 г. и месец ноември, взех ден.

Запитване:

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

Ето моментна снимка на директните изчисления на използваните от мен данни.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Опитвам се да направя LOAD DATA INFILE с REPLACE и AUTO_INCREMENT

  2. Как мога да филтрирам заявка по часовата част на поле DateTime в MySQL?

  3. Използване на MySQL IN клауза като all inclusive (И вместо ИЛИ)

  4. Импортирайте CSV файл директно в MySQL

  5. PHP MYSQL динамично поле за избор