2014-10-01 94 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;