У меня есть несколько устройств в полевых условиях, отправляющих данные по GSM, время от времени теряя соединение.Поскольку у меня ограниченное дисковое пространство, я склонен терять некоторые данные в периоды без подключения, поэтому мне нравится оценивать объем ожидающих данных, чтобы получить представление о ситуации.
Если я уменьшу таблицу со своего серверадля столбцов, которые мне нужны, это выглядит так:
Declare @table as table(
timestamp datetime,
lastchanged datetime )
INSERT INTO @table
VALUES
('2019-04-01 12:27:23', '2019-04-01 12:26:17'),
('2019-04-01 12:27:23', '2019-04-01 12:25:47'),
('2019-04-01 12:27:23', '2019-04-01 12:26:17'),
('2019-04-01 12:27:23', '2019-04-01 12:26:03'),
('2019-04-01 12:27:23', '2019-04-01 12:26:20'),
('2019-04-01 12:28:23', '2019-04-01 12:25:52'),
('2019-04-01 12:28:23', '2019-04-01 12:26:22'),
('2019-04-01 12:28:23', '2019-04-01 12:26:18'),
('2019-04-01 12:28:23', '2019-04-01 12:25:54'),
('2019-04-01 12:29:23', '2019-04-01 12:25:47'),
('2019-04-01 12:29:23', '2019-04-01 12:26:17'),
('2019-04-01 12:29:23', '2019-04-01 12:25:47'),
('2019-04-01 12:29:23', '2019-04-01 12:25:45'),
('2019-04-01 12:30:23', '2019-04-01 12:26:17'),
('2019-04-01 12:30:23', '2019-04-01 12:25:47'),
('2019-04-01 12:30:23', '2019-04-01 12:26:17'),
('2019-04-01 12:31:23', '2019-04-01 12:26:03'),
('2019-04-01 12:31:23', '2019-04-01 12:26:20'),
('2019-04-01 12:31:23', '2019-04-01 12:25:52'),
('2019-04-01 12:31:23', '2019-04-01 12:26:22'),
('2019-04-01 12:31:23', '2019-04-01 12:26:18'),
('2019-04-01 12:31:23', '2019-04-01 12:25:54'),
('2019-04-01 12:32:23', '2019-04-01 12:25:47'),
('2019-04-01 12:32:23', '2019-04-01 12:26:17'),
('2019-04-01 12:32:23', '2019-04-01 12:25:47'),
('2019-04-01 12:32:23', '2019-04-01 12:25:45');
, так как значение timestamp (первый столбец) createt на сервере, а last last (второй столбец) - это временная метка от устройства, очевидно, чтозадержка процесса отправки.
Для каждого датчика от моего устройства я получаю отдельную запись, поэтому мне просто нужно подсчитать строки, чтобы получить представление о том, сколько точек данных было сохранено на устройстве в определенном диапазоне.времени (это зависит от поведения устройства).
Теперь мне нравится группировать по меткам времени, чтобы оценить для каждой из этих меток времени, сколько наборов данных уже создано, но не достигло сервераso тарифы.
Итак, для каждой временной отметки я хотел бы знать количество строк в наборе данных, которые имеютвременная метка в будущем, но последняя изменилась в прошлом.
Поскольку мой набор данных очень большой, я бы хотел избежать выборки.
И да, это не должен быть анализ во времениМне просто нужно, чтобы понять поведение устройства и настроить некоторые параметры.
Я уже пробовал это:
SELECT
A.timestamp,
COUNT(case when (A.timestamp < B.timestamp AND A.timestamp > B.lastchanged ) then 1 else null end) AS CountPending
FROM @table A, @table B
GROUP BY A.timestamp
ORDER BY A.timestamp
и думаю, что CTE и подзапросы не помогут, так как мне нужно выполнить фильтрацию и подсчет за один шаг.И, как я понимаю, классические запущенные окна в SQL просто нуждаются в фиксированном количестве записей для диапазона окон, но в моем наборе данных это число не является постоянным вообще.
Применительно к приведенному выше примерурезультат просто неверный:
2019-04-01 12:27:23.000 105
2019-04-01 12:28:23.000 68
2019-04-01 12:29:23.000 52
2019-04-01 12:30:23.000 30
2019-04-01 12:31:23.000 24
2019-04-01 12:32:23.000 0