MySql последнее значение, отличное от NULL, для различных столбцов и строки datetime - PullRequest
0 голосов
/ 10 марта 2020

У меня есть таблица с именем «raw_temp» в MySQL (10.1.44-MariaDB), которая называется «test».

Она содержит значения датчика в следующем формате, и, к сожалению, я не могу сделать что-нибудь о формате.

+----+--------+--------+--------+--------+--------+--------+---------------------+
| id |  api   | value1 | value2 | value3 | value4 | value5 |    reading_time     |
+----+--------+--------+--------+--------+--------+--------+---------------------+
|  1 | asdasd | 1968   | 19.70  | 52.50  | NULL   | NULL   | 2020-03-02 21:34:46 |
|  2 | asdasd | NULL   | NULL   | NULL   | 100    | NULL   | 2020-03-02 21:35:46 |
|  3 | asdasd | 1974   | 19.70  | 52.50  | NULL   | NULL   | 2020-03-02 21:37:47 |
|  4 | asdasd | NULL   | NULL   | NULL   | NULL   | 88     | 2020-03-02 21:39:05 |
|  5 | xdfsgh | 2543   | NULL   | NULL   | NULL   | NULL   | 2020-03-02 21:39:49 |
+----+--------+--------+--------+--------+--------+--------+---------------------+

Я хотел бы иметь возможность получить следующее из запроса SELECT, где read_time находится между "2020-03-02 21:35:01" и "2020-03" -02 21:40:00 ". Наименьшая одна строка для каждого значения «api» и столбцы значений, показывающие последнее значение чтения, отличное от NULL (и, если их нет, показывают NULL) и столбец времени чтения значения, показывающий ассоциированное время чтения для этого значения (возможно, это вместе с таблицей ниже имеет смысл).

Возможно ли это вообще сначала в операторе MySQL SELECT (у меня также есть возможность использовать Python для создания сводки (я думаю, с циклами и списками)? Например, в действительности имеется около 2000 строк значений датчика и около 150 значений API, и в идеале мне бы хотелось, чтобы запрос выполнялся в течение <1 минуты, чтобы дать время для другой обработки до следующего 5-минутного интервала. </p>

+--------+--------+---------------------+--------+---------------------+--------+---------------------+--------+----------------------+--------+----------------------+ 
|  api   | value1 | value1_reading_time | value2 | value2_reading_time | value3 | value3_reading_time | value4 | value4_reading_time  | value5 | value5_reading_time  |
+--------+--------+---------------------+--------+---------------------+--------+---------------------+--------+----------------------+--------+----------------------+
| asdasd |   1974 | 2020-03-02 21:37:47 | 19.70  | 2020-03-02 21:37:47 | 52.50  | 2020-03-02 21:37:47 | 100    | 2020-03-02 21:35:46  | 88     | 2020-03-02 21:39:05  |
| xdfsgh |   2543 | 2020-03-02 21:39:49 | NULL   | NULL                | NULL   | NULL                | NULL   | NULL                 | NULL   | NULL                 |
+--------+--------+---------------------+--------+---------------------+--------+---------------------+--------+----------------------+--------+----------------------+

1 Ответ

1 голос
/ 10 марта 2020

Если вы используете MySQL 8.0, вы можете использовать оконные функции в подзапросе, чтобы вычислить последнюю дату доступности каждого значения, а затем выполнить условное агрегирование.

Вот пример для трех значений:

select
    api,
    max(case when reading_time = max_reading_time_1 then value1 end) value1,
    max_reading_time_1,
    max(case when reading_time = max_reading_time_2 then value2 end) value2,
    max_reading_time_2,
    max(case when reading_time = max_reading_time_3 then value3 end) value3,
    max_reading_time_3
from (
    select
        t.*,
        max(case when value1 is not null then reading_time else end) 
            over(partition by api) max_reading_time_1,
        max(case when value2 is not null then reading_time else end)
            over(partition by api) max_reading_time_2,
        max(case when value3 is not null then reading_time else end) 
            over(partition by api) max_reading_time_3
    from t
) t
where reading_time in (max_reading_time_1, max_reading_time_2, max_reading_time_3)
group by api
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...