MySQL - извлечение самого последнего значения в диапазоне дат для группы идентификаторов.

0

У меня есть запрос ниже

SELECT SUM(CAST(hd.value AS SIGNED)) as case_count
FROM historical_data hd
WHERE hd.tag_id IN (45,109,173,237,301,365,429)
AND hd.shift = 1
AND hd.timestamp BETWEEN '2018-04-10' AND '2018-04-11'
ORDER BY TIMESTAMP DESC

и с этим я пытаюсь выбрать СУММУ значения для каждого из переданных идентификаторов в течение периода времени в операторе BETWEEN, но самый последний соответствует этому таймфрейму. Таким образом, конечным результатом будет SUM значений case_count для каждого идентификатора, прошедшего в последней временной отметке, которую идентификатор имеет в этом диапазоне дат.

Мне трудно понять, КАК это сделать. Моя таблица history_data ОГРОМНАЯ, однако у меня есть очень специфическая индексация на ней, которая позволяет запросам работать достаточно хорошо, а также разбиение на таблицу по YEAR.

Может ли кто-нибудь указать указатель на то, как получить нужные мне данные? Я бы предпочел не перебирать список идентификаторов и запускать этот запрос без SUM и LIMIT 1, но я думаю, что могу, если это единственный способ.

Теги:
subquery

1 ответ

1
Лучший ответ

Вот один из способов:

SELECT SUM(CAST(hd.value AS SIGNED)) as case_count
FROM historical_data hd
WHERE hd.tag_id IN (45, 109, 173, 237, 301, 365, 429) AND
      hd.shift = 1 AND
      hd.timestamp = (SELECT MAX(hd2.timestamp)
                      FROM historical_data hd
                      WHERE hd2.tag_id = hd.tag_id AND
                            hd2.shift = hd.shift AND
                            hd2.timestamp BETWEEN '2018-04-10' AND '2018-04-11'
                     );

Оптимальным индексом для этого запроса является historical_data(shift, tag_id, timestamp).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню