Группировка накопленной суммы по дате и столбцам пользователя в MySQL - PullRequest
0 голосов
/ 08 мая 2018

В настоящее время у меня есть таблица mysql, которая выглядит следующим образом:

+---------------------+------+-------+-------+-------+
|      datetime       | name | flag1 | flag2 | flag3 |
+---------------------+------+-------+-------+-------+
| 2018-05-06 00:00:05 | john |     0 |     2 |     1 |
| 2018-05-06 00:00:10 | john |     1 |     0 |     1 |
| 2018-05-06 00:00:15 | john |     1 |     1 |     1 |
| 2018-05-06 00:00:05 | troy |     1 |     1 |     1 |
| 2018-05-06 00:00:10 | troy |     1 |     1 |     1 |
| 2018-05-06 00:00:15 | troy |     1 |     0 |     1 |
| 2018-05-05 00:00:05 | john |     1 |     0 |     0 |
| 2018-05-05 00:00:10 | john |     1 |     1 |     0 |
| 2018-05-05 00:00:15 | john |     0 |     1 |     0 |
| 2018-05-05 00:00:05 | troy |     2 |     1 |     1 |
| 2018-05-05 00:00:10 | troy |     3 |     1 |     0 |
| 2018-05-05 00:00:15 | troy |     3 |     1 |     3 |
| 2018-05-04 00:00:05 | john |     1 |     1 |     1 |
| 2018-05-04 00:00:10 | john |     1 |     1 |     1 |
| 2018-05-04 00:00:15 | john |     0 |     0 |     2 |
| 2018-05-04 00:00:05 | troy |     3 |     1 |     0 |
| 2018-05-04 00:00:10 | troy |     1 |     1 |     1 |
| 2018-05-04 00:00:15 | troy |     1 |     1 |     1 |
+---------------------+------+-------+-------+-------+

Я хочу объединить его в кумулятивное значение каждого из флагов для каждого отдельного имени в каждый уникальный день.

Я пытаюсь объединить это в это:

+------------+------+-------------+-------------+-------------+
|    date    | name | total_flag1 | total_flag2 | total_flag3 |
+------------+------+-------------+-------------+-------------+
| 2018-05-06 | john |           2 |           3 |           3 |
| 2018-05-06 | troy |           3 |           2 |           3 |
| 2018-05-05 | john |           2 |           2 |           0 |
| 2018-05-05 | troy |           8 |           3 |           4 |
| 2018-05-04 | john |           2 |           2 |           4 |
| 2018-05-04 | troy |           5 |           3 |           2 |
+------------+------+-------------+-------------+-------------+

Фактическая таблица, с которой я имею дело, содержит 300+ уникальных имен, с 288 (5-минутными интервалами в течение дня) строк для каждого, содержащего значения флага для каждого времени.

Я знаю, что могу сделать это для каждой отдельной даты / имени, выполнив что-то вроде следующего:

@flag1Cuml := 0;
@flag2Cuml := 0;
@flag2Cuml := 0;

SELECT  
    DATE(datetime) as date,
    name,
    (@flag1Cuml  := @flag1Cuml  + flag1) as total_flag1,
    (@flag2Cuml  := @flag2Cuml  + flag2) as total_flag2,
    (@flag2Cuml  := @flag2Cuml  + flag3) as total_flag3
WHERE 
    name = 'John'
    AND DATE(datetime) = '2018-05-06'

Очевидно, что это не оптимально, так как мой стол такой большой. Я уверен, что это можно сделать одним вложенным запросом, но я новичок в mysql и не уверен, как получить то, что мне нужно.

В идеале я хотел бы использовать этот запрос для создания нового представления, если это возможно.

1 Ответ

0 голосов
/ 08 мая 2018

Я не вижу ничего общего с числами. Я вижу простой group by:

select date(datetime) as date, name, sum(flag1) as flag1,
       sum(flag2) as flag2, sum(flag3) as flag3
from t
group by date(datetime), name;
...