MySQL组记录到特定的时间块

时间:2013-01-14 15:21:23

标签: mysql

您好

我试图找出一种将记录分组到某些块的有效方法。记录由计数和时间组成,请参见下面的示例。每分钟计数一次。

+----------+---------------+---------------+
| count_id | count_reading | count_time    |
+----------+---------------+---------------+
| 5847348  | 168           | 1358174236000 |
+----------+---------------+---------------+
| 5847347  | 342           | 1358174176000 |
+----------+---------------+---------------+
| 5847346  | 228           | 1358174116000 |
+----------+---------------+---------------+
| 5847345  | 240           | 1358174056000 |
+----------+---------------+---------------+
| 5847344  | 12            | 1358173996000 |
+----------+---------------+---------------+
| 5847343  | 0             | 1358173936000 |
+----------+---------------+---------------+
| 5847342  | 48            | 1358173876000 |
+----------+---------------+---------------+
| 5847341  | 480           | 1358173816000 |
+----------+---------------+---------------+
| 5847340  | 473           | 1358173756000 |
+----------+---------------+---------------+
| 5847339  | 380           | 1358173696000 |
+----------+---------------+---------------+

我想要实现的是个人轮班计数的总和,我有两种情况,我坚持......

  • 从0700-1900和1900-0700开始的12小时轮班的总和。
  • 运行0700-1400,1400-2200和2200-0700的班次总和。

结果看起来像是:

+---------------+--------------------------------------------+
| count_reading | count_time                                 |
+---------------+--------------------------------------------+
| 10000         | Between 0700 and now starting on the 13th  |
+---------------+--------------------------------------------+
| 20000         | Between 1900 and 0700 starting on the 12th |
+---------------+--------------------------------------------+
| 50000         | Between 0700 and 1900 starting on the 12th |
+---------------+--------------------------------------------+
| 10000         | Between 1900 and 0700 starting on the 11th |
+---------------+--------------------------------------------+

我正在处理两个根据场景解决上述问题的查询。我一直在寻找帮助,但运气不好,如果有人能够帮助我,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

group by可以使用任意子句和派生值,例如(在伪代码中):

SELECT SUM(count_reading), TIME(count_time) BETWEEN 7 and 19 AS shift
GROUP BY shift

你最终会得到两个小组 - {7}的shift = 1和19-7的shift = 0

类似于3向移位,更多逻辑:

SELECT sum(count_reading),
    CASE WHEN TIME(count_time) BETWEEN 7 AND 14 THEN 1 ELSE
         WHEN TIME(count_time) BETWEEN 14 and 22 THEN 2
         ELSE 3 END AS shift
GROUP BY shift

实际的逻辑/ sql语法应该非常简单。