SQL: выборка разреженных данных (не больше раза в час)
Table of Contents
Допустим, мы сохраняем данные в базу раз в 10 минут.
Нужно достать данные из базы, начинающиеся с определённого времени и не чаще одного раза за час.
В качестве базы используется sqlite3, но идея реализуется так же для других SQL.
Способ 1. Более простой.
Предполагаем, что сбор данных работает без сбоев, и каждые 10 минут данные сохраняются. Тогда достаточно достать только те данные, которые сохранялись в первые 10 минут часа.
1 2 3 4 5 6 7 8 9 10 11 12 |
SELECT res.* FROM (SELECT CAST(STRFTIME("%M", DATETIME(c.dt_request, 'unixepoch')) AS DECIMAL) AS minute, c.id FROM table AS c WHERE c.dt_request >= 1469474975 ) AS c INNER JOIN table AS res ON res.id = c.id WHERE c.minute BETWEEN 0 AND 10 ORDER BY res.dt_request DESC; |
Хорошо работает, если сбор данных не сбоит, или не было принято решение сделать сбор данных более редким. В этих случаях могут появляться пропуски в результатах, а если не повезёт, то результатов не будет совсем.
Способ 2. Чуть сложнее.
Для каждого часа выбираем запись с наименьшим временем.
1 2 3 4 5 6 7 8 9 10 11 12 |
SELECT res.* FROM (SELECT MIN(c.dt_request) AS min_time, CAST(STRFTIME("%Y%m%d%H", DATETIME(c.dt_request, 'unixepoch')) AS DECIMAL) AS dh FROM table AS c WHERE c.dt_request >= 1 GROUP BY dh ) AS m INNER JOIN table AS res ON res.dt_request = m.min_time ORDER BY res.dt_request DESC; |
Если не забывать про индекс по столбцу dt_request
, план выполнения должен получиться вполне приличным.
В качестве дополнения — форматирование дат в sqlite3
Similar Posts
LEAVE A COMMENT
Для отправки комментария вам необходимо авторизоваться.