Mysql: как получить временный запрос с накопленной суммой (неожиданный результат) - PullRequest
0 голосов
/ 31 марта 2019

У меня есть система контроля доступа RFID.Исходя из этой таблицы, я хотел бы получить запрос, который позволит мне получить график времени посещаемости дня, разбитого на 10 минут.

Структура таблицы следующая:

  • id
  • id_rfid
  • ...
  • type (0 = вход или 1 = выход)
  • success (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 за правильный ответ.Первый шаг в порядке.Теперь мне нужно отрезать время, чтобы получить такой результат:

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

1 Ответ

0 голосов
/ 31 марта 2019

Вы должны запустить агрегатную функцию на j.conteggio следующим образом:

SUM(`j`.`conteggio`) AS `cumulativo`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...