2014-10-01 2 views
0

Я хочу, чтобы получить лучший день 3 пользователей между «2014-07-01» и «2014-08-01»Sql запросов с интервалом времени

Может кто-нибудь мне помочь? Я застрял здесь в течение 3 дней.

В действительных записях таблицы 10:00 - 22:00 и 1 запись за каждый час.

Всего 12 записей за каждый день и каждого игрока (иногда это может быть меньше 1 или 2).

Это выход я пытаюсь получить:

ID | User_ID | Username | Sum(Score) | Date 
-------------------------------------------------- 
1 | 1 | Xxx |  52  | 2014-07-01 
2 | 1 | Xxx |  143 | 2014-07-02 
3 | 2 | Yyy |  63  | 2014-07-01 
... 

Score стол:

ID | User_ID | Score | Datetime 
----------------------------------------- 
1 | 1 | 35 | 2014-07-01 11:00:00 
2 | 1 | 17 | 2014-07-01 12:00:00 
3 | 2 | 36 | 2014-07-01 11:00:00 
4 | 2 | 27 | 2014-07-01 12:00:00 
5 | 1 | 66 | 2014-07-02 11:00:00 
6 | 1 | 77 | 2014-07-02 12:00:00 
7 | 2 | 93 | 2014-07-02 12:00:00 
... 

User стол:

ID | Username 
-------------- 
1 | Xxx 
2 | Yyy 
3 | Zzz 
... 
+0

Я думаю, что вы хотите 63 в вашем третьем ряду в желаемых результатов , – Mihai

+0

Вы правы, я изменил его до 63. –

ответ

1

Я думаю, вам нужно агрегировать сначала даты, а затем выберите первые три, используя row_number(). Для агрегации:

select s.user_id, sum(s.datetime, 'day') as theday, sum(score) as score, 
     row_number() over (partition by s.user_id order by sum(score) desc) as seqnum 
from scores s 
group by s.user_id; 

Чтобы получить остальную информацию, использовать это в качестве подзапроса или КТР:

select u.*, s.score 
from (select s.user_id, sum(s.datetime, 'day') as theday, sum(s.score) as score, 
      row_number() over (partition by s.user_id order by sum(s.score) desc) as seqnum 
     from scores s 
     group by s.user_id 
    ) s join 
    users u 
    on s.user_id = u.users_id 
where seqnum <= 3 
order by u.user_id, s.score desc; 
1
SELECT  'group has no id' as ID, 
      u.ID    as User_ID, 
      u.Username, 
      sum(s.Score)  "Sum(Score)", 
      s.Datetime::date as Date 
FROM  User u, 
      Score s 
WHERE  u.id = s.User_ID 
AND   s.Datetime BETWEEN '2014-07-01' AND '2014-08-01 23:59:59' 
GROUP BY u.ID, u.Username, s.Datetime::date 
ORDER BY sum(s.Score) DESC 
LIMIT 3; 
Смежные вопросы