2014-10-01 72 views
0

我想在“2014-07-01”和“2014-08-01”之间获得最佳用户3天SQL查询与时间间隔

有人可以帮我吗?我在这里呆了3天。

在实际得分表中的条目是10点到22点,每小时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 2014-10-01 21:18:03

+0

你说得对,我把它改成了63。 – 2014-10-02 10:02:25

回答

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; 

要获取的其余信息,以此作为一个子查询或CTE:

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;