2012-12-14 11 views
1

獲得最大的用戶分數我有一個MySQL表,像這樣的樣本數據:從每小時款項

+---------+---------+--------+---------------------+ 
|  id | user_id | scores |   created_at | 
+---------+---------+--------+---------------------+ 
|  1 |  1 |  10 | 2012-12-14 02:40:37 | 
|  2 |  1 |  20 | 2012-12-14 02:55:54 | 
|  3 |  1 |  10 | 2012-12-14 01:17:21 | 
|  4 |  2 |  30 | 2012-12-13 01:54:47 | 
|  5 |  2 |  55 | 2012-12-15 00:34:39 | 
|  6 |  2 |  10 | 2012-12-14 00:20:21 | 
+---------+---------+--------+---------------------+ 

,我需要查詢它,這樣的分數將每個用戶每小時相加。一小時假定爲created_at,跳過分鐘和秒(04:00:00至04:59:59等)。因此,像這樣:

+---------+--------+---------------------+ 
| user_id | scores |   created_at | 
+---------+--------+---------------------+ 
|  1 |  30 | 2012-12-14 02:00:00 | 
|  1 |  10 | 2012-12-14 01:00:00 | 
|  2 |  30 | 2012-12-13 01:00:00 | 
|  2 |  55 | 2012-12-15 00:00:00 | 
|  2 |  10 | 2012-12-14 00:00:00 | 
+---------+--------+---------------------+ 

在這個樣本數據只有第一個用戶一個小時(2012年12月14日02:00:00)中播放一次以上 - 這樣一個小時內他的成績進行了歸納。

從總結分數我只需要每個用戶的最高分(創建排名)。所以最終,預期的結果應該是:

+---------+---------------------+---------------------+ 
| user_id | top_scores_per_hour |    hour | 
+---------+---------------------+---------------------+ 
|  1 |     30 | 2012-12-14 02:00:00 | 
|  2 |     55 | 2012-12-15 00:00:00 | 
+---------+---------------------+---------------------+ 

我有一個想法如何做到的這部分...我可以處理其他數據庫之外,但我真的不知道 - 我怎麼能查詢這個與SQL?

回答

1
SELECT a.user_id, 
     a.totalScores top_scores_per_hour, 
     a.newTime hour 
FROM 
    (
     SELECT user_id, 
       SUM(Scores) totalScores, 
       DATE_Format(created_at, '%Y-%m-%d %H:00:00') newTime 
     FROM TableName 
     GROUP BY user_id, DATE_Format(created_at, '%y-%m-%d %H:00:00') 
    ) a INNER JOIN 
    (
     SELECT user_id, 
       max(DATE_Format(created_at, '%Y-%m-%d %H:00:00')) newTime 
     FROM TableName 
     GROUP BY user_ID 
    ) b ON a.user_ID = b.user_ID AND 
      a.newTime = b.newTime 

輸出

╔═════════╦═════════════════════╦═════════════════════╗ 
║ USER_ID ║ TOP_SCORES_PER_HOUR ║  HOUR   ║ 
╠═════════╬═════════════════════╬═════════════════════╣ 
║  1 ║     30 ║ 2012-12-14 02:00:00 ║ 
║  2 ║     55 ║ 2012-12-15 00:00:00 ║ 
╚═════════╩═════════════════════╩═════════════════════╝ 
+0

對不起,使用更多數據後我不接受。它總是選擇最新的小時和總分數,而不是選擇總分最高的小時。 – Luigi

+1

@Luigi再次嘗試這個,http://sqlfiddle.com/#!2/f5cd1/28 –

+0

評論是我的需求真正的答案。如果可以的話,我會接受它,謝謝。 – Luigi

0

如何

Select user_id, Max(totalHouirlyScore) TopHourlyScore 
From (Select user_id, Sum(scores) totalHouirlyScore 
     From tablename 
     Group By user_id, 
      DateFormat(created_at, '%y%m%d%H')) Z 
+0

問題是我還需要小時欄:( – Luigi

+0

你不能只是添加'DateFormat(created_at,'%y%m%d%H'))Z'到選擇列的列表嗎? – Greg

+0

Greg - nope。除了運行此查詢即使沒有小時列也不會返回預期的數據。 – Luigi

1

試試這個:

SELECT user_id, score, createdDate 
FROM (SELECT user_id, SUM(scores) score, DATE_FORMAT(created_at, '%Y-%m-%d %H:00:00') createdDate 
     FROM tablename 
     GROUP BY user_id, createdDate 
     ORDER BY user_id, score DESC) AS A 
GROUP BY user_id 
+0

這也適用,看起來更簡單。然而,我擔心安全 - 結果總是與預期相符。因爲沒有保證,那麼非分組的列將始終在最後一組行中使用,對嗎?我選擇了其他答案,但這個也很好。謝謝。 – Luigi