Mysql запрос нескольких операторов выбора вывода на несколько столбцов - PullRequest
0 голосов
/ 10 ноября 2018

Таблица

+------+-------+------------------+
|CLIENT| VALUE |    DATETIME      |
+------+-------+------------------+
|  A   |  1    | 2018-11-10 09:00 |
|  B   |  1    | 2018-11-10 09:00 |
|  C   |  1    | 2018-11-10 09:00 |
|  D   |  2    | 2018-11-10 08:00 |
|  E   |  2    | 2018-11-10 08:00 |
|  F   |  3    | 2018-11-10 08:00 |
|  A   |  1    | 2018-11-10 07:00 |
|  B   |  2    | 2018-11-10 07:00 |
|  C   |  2    | 2018-11-10 07:00 |
|  D   |  3    | 2018-11-10 06:00 |
|  E   |  1    | 2018-11-10 06:00 |
|  F   |  2    | 2018-11-10 06:00 |
|  A   |  1    | 2018-11-08 08:00 |
|  B   |  2    | 2018-11-08 08:00 |
|  C   |  2    | 2018-11-08 08:00 |
|  D   |  1    | 2018-11-08 08:00 |
|  E   |  1    | 2018-11-08 07:00 |
|  F   |  2    | 2018-11-08 07:00 |

Я новичок в MySQL, и у меня проблемы с этим запросом.

У меня есть только одна таблица с именем "таблица" с тремя столбцами.

В эту таблицу ежедневно записывается множество данных в разное время из определенного набора клиентов A, B, C, D, E, F

С помощью одного запроса мне нужно создать новую таблицу с одной строкой для каждого клиента и со следующими 4 столбцами:

  1. первый столбец должен содержать самое новое значение, записанное в таблице для каждого клиента
  2. второй столбец должен содержать процентное значение времени, равное 1 для каждого клиента в течение последних 24 часов
  3. третий столбец должен содержать процент времени, в течение которого значение равно 1 для каждого клиента в течение последних 7 дней
  4. как предыдущий столбец, но в течение последних 30 дней

Надеюсь, кто-нибудь сможет мне помочь.

Что бы я хотел получить:

+------+-------------+-----------+--------------+--------------+
|CLIENT| NEWEST VALUE| LAST 24 H | LAST 7 DAYS  | LAST 30 DAYS |
+------+-------------+-----------+--------------+--------------+
|  A   |       1     |    100%   |      100%    |     ...      | 
|  B   |       1     |     50%   |       66%    |     ...      |
|  C   |       1     |     50%   |       33%    |     ...      |
|  D   |       2     |      0%   |       33%    |     ...      |
|  E   |       2     |     50%   |       66%    |     ...      |
|  F   |       3     |      0%   |        0%    |     ...      |

Этот фрагмент кода отлично работает для создания столбца «NEWST VALUE»

SELECT
    client,
    value,
    max(datetime)
FROM
    table
GROUP BY
    client;

и этот столбец "LAST 24 H" создает

SELECT
    client,
    count(if(value = 1,1, null))/count(value),
FROM
    table
WHERE
    date(datetime) < CURRENT_DATE() - interval 1 day
GROUP BY
    repository_name;

но я не могу собрать весь вывод в одну новую таблицу

1 Ответ

0 голосов
/ 10 ноября 2018

Вы можете использовать условное агрегирование. Предполагая MySQL до 8.0, только самое последнее значение действительно сложно. Вот один из подходов:

select t.client,
       max(case when t.datetime = c.maxdt then t.value end) as most_recent_value,
       avg(case when t.datetime >= now() - interval 1 day
                then (t.value = 1)
           end) as last_day_percentage,
       avg(case when t.datetime >= now() - interval 7 day
                then (t.value = 1)
           end) as last_7day_percentage,
       avg(case when t.datetime >= now() - interval 30 day
                then (value = 1)
           end) as last_30day_percentage                
from t join
     (select t.client, max(t.datetime) as maxdt
      from t
      group by t.client
     ) c
     on c.client = t.client
group by t.client;

Обратите внимание, что в этой логике используется расширение MySQL, в котором логические значения обрабатываются как числа в числовом контексте: 1 для true и 0 для false.

Среднее значение выдает «0» или «1» для рассматриваемого периода времени со значениями NULL для любой другой записи. Функция avg() игнорирует значения NULL.

...