Mysql:如何获得具有累积总和的时间片查询(意外结果)

Mysql: how to get a timesliced query with cumulative sum (unexpected result)

我有一个 RFID 访问控制系统。从这个开始 table 我想得到一个查询,它允许我得到一个图表,将当天的出勤时间划分为 10 分钟。

table 的结构如下:

我尝试(在我的 MySQL 5.7 测试环境中)使用此查询,但得到了意想不到的结果。怎么了?

SELECT
    *, 
    SUM(`i`.`conteggio`) AS `cumulativo`
    -- FROM_UNIXTIME(CEIL(`i`.`created_at`/(10 * 60))*(10 * 60)) AS datetime
FROM 
    (
        SELECT 
            `id`, 
            `id_rfid`, 
            CASE
                WHEN `type` = 0 AND `success` = 0 THEN 1
                WHEN `type` = 1 AND `success` = 0 THEN -1
                ELSE 0
            END AS `conteggio`, 
            `created_at`, 
            FROM_UNIXTIME(`created_at`) AS `created_datetime`
        FROM 
            `tbl_ingresso` 
        LIMIT 100
    ) AS i
JOIN 
    (
        SELECT 
            `id`, 
            `id_rfid`, 
            CASE
                WHEN `type` = 0 AND `success` = 0 THEN 1
                WHEN `type` = 1 AND `success` = 0 THEN -1
                ELSE 0
            END AS `conteggio`, 
            `created_at`, 
            FROM_UNIXTIME(`created_at`) AS `created_datetime`
        FROM 
            `tbl_ingresso` 
        LIMIT 100
    ) AS j
ON 
    DATE(FROM_UNIXTIME(`i`.`created_at`)) = DATE(FROM_UNIXTIME(`j`.`created_at`)) AND
    `i`.`created_at` >= `j`.`created_at`
GROUP BY 
    1,4
    -- CEIL(`i`.`created_at`/(10 * 60)) 
-- LIMIT 100
;

结果:

id  id_rfid conteggio   created_at  created_datetime    ... cumulativo  
2   1       1           1479110294  2016-11-14 08:58:14     1   
3   92      1           1479111188  2016-11-14 09:13:08     2   
4   40      1           1479111220  2016-11-14 09:13:40     3   
5   101     1           1479111227  2016-11-14 09:13:47     4   
6   100     1           1479112470  2016-11-14 09:34:30     5   
7   100     1           1479112483  2016-11-14 09:34:43     6   
8   74      1           1479113518  2016-11-14 09:51:58     7   
9   128     1           1479113608  2016-11-14 09:53:28     8   
10  117     1           1479113671  2016-11-14 09:54:31     9   
11  55      1           1479113866  2016-11-14 09:57:46     10  
12  40      -1          1479114971  2016-11-14 10:16:11     -11 (expected result: 9)
13  92      -1          1479114980  2016-11-14 10:16:20     -12 (expected result: 8)
14  125     1           1479115206  2016-11-14 10:20:06     13  (expected result: 9)
15  126     1           1479115212  2016-11-14 10:20:12     14  (expected result: 10)
16  33      1           1479115218  2016-11-14 10:20:18     15  ...
17  101     -1          1479116013  2016-11-14 10:33:33     -16 
18  128     -1          1479117003  2016-11-14 10:50:03     -17 
19  117     -1          1479117324  2016-11-14 10:55:24     -18 
20  128     1           1479117548  2016-11-14 10:59:08     19  
21  1       -1          1479117669  2016-11-14 11:01:09     -20 
22  131     1           1479117952  2016-11-14 11:05:52     21  
23  129     1           1479118134  2016-11-14 11:08:54     22  
24  1       1           1479119066  2016-11-14 11:24:26     23  
25  126     -1          1479119237  2016-11-14 11:27:17     -24 
26  125     -1          1479119244  2016-11-14 11:27:24     -25 

更新: 感谢@muhamed 的正确答案。第一步没问题。现在我需要对其进行时间切片以获得此结果:

cumulativo  datetime    
1           2016-11-14 09:00:00 
4           2016-11-14 09:20:00 
6           2016-11-14 09:40:00 
10          2016-11-14 10:00:00 
8           2016-11-14 10:20:00 
11          2016-11-14 10:30:00 
10          2016-11-14 10:40:00 
9           2016-11-14 11:00:00 
10          2016-11-14 11:10:00 
...

您应该 运行 j.conteggio 上的聚合函数如下:

SUM(`j`.`conteggio`) AS `cumulativo`