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 |
+---------+---------+--------+---------------------+

そして、スコアがユーザーごと、時間ごとに合計されるように、クエリを実行する必要があります。ここでの 1 時間は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 |
+---------+--------+---------------------+

このサンプル データでは、最初のユーザーのみが 1 時間 (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でクエリするにはどうすればよいですか?

4

3 に答える 3

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 ║
╚═════════╩═════════════════════╩═════════════════════╝
于 2012-12-14T02:38:18.777 に答える
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
于 2012-12-14T09:34:28.060 に答える
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
于 2012-12-14T02:25:39.237 に答える