У меня есть запрос ниже
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, но я думаю, что могу, если это единственный способ.
Вот один из способов:
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)
.