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

标签 mysql join cumulative-sum

我有一个 RFID 门禁系统。从该表开始,我希望获得一个查询,该查询允许我获取当天的出勤时间(时间分为 10 分钟)的图表。

表的结构如下:

  • id
  • id_rfid
  • ...
  • 类型(0 = 输入或 1 = 输出)
  • 成功(0 = 是或 1 = 否)
  • ...
  • created_at(时间戳)

我尝试(在 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 的正确答案。第一步就OK了。现在我需要对其进行时间切片以获得此结果:

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`

关于Mysql:如何获取具有累积和的时间片查询(意外结果),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55443619/

相关文章:

php - 使用 PHP 将图像路径从数据库传递到 HTML 图像源

MySQL选择所有父数据和子数据(包括空值)

php - 三个表之间的内部连接以获取信息

Mysql Running Balance by group 来自不同的表

Pyspark:对于每个月,对前 3 个月进行累计

mysql - 使用累加和循环统计总和

PHP fwrite();创建额外的角色

mysql - 查找和替换字符的想法

mysql - 从两个表中获取数据,其中一个表独立于另一个表

c# - 使用 linq 检查是否不存在子句