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
Для отправки комментария вам необходимо авторизоваться.