2016-09-05 3 views
0

У меня есть таблица, которая показывает разные значения за метку времени. Линия вставляется в таблицу каждый раз, когда значение изменилось (например, контроллер термометра).как «нормализовать» результаты запроса

Отображение записей приведет только к изменениям и временным меткам. Моя проблема заключается в том, что мне нужно показывать результаты за минуту или около того, даже если значение не изменилось вообще. И без вставки «пустых» строк в таблицу.

Я попытался соединить мой стол с видом, который показывает все марки getdate() с той же даты, но я не мог заставить запрос работать.

05 Sep 2016 09:50:24 20 
05 Sep 2016 09:56:14 18 

должен быть

05 Sep 2016 09:50:24 20 
05 Sep 2016 09:51:24 20 
05 Sep 2016 09:52:24 20 
05 Sep 2016 09:53:24 20 
05 Sep 2016 09:54:24 20 
05 Sep 2016 09:55:24 20 
05 Sep 2016 09:56:14 18 
05 Sep 2016 09:57:24 18 
. 
. 
+2

Один из вариантов здесь будет иметь таблицу даты/времени, который используется для заполнения недостающих данных. –

ответ

2

Вы должны использовать рекурсивное ОТВ. Я предполагаю, что столбцы называются ChangedDate для даты и времени и SomeValue для любого значения во втором столбце в вашем вопросе.

;WITH cte AS (
SELECT t.ChangedDate, 
     t.SomeValue, 
     p.ChangedDate as NextDate 
FROM YourTable t 
OUTER APPLY (
    SELECT top 1 * 
    FROM YourTable 
    WHERE t.ChangedDate <ChangedDate 
    ORDER BY ChangedDate 
    ) p 
UNION ALL 
SELECT DATEADD(minute,1,ChangedDate), 
     SomeValue, 
     NextDate 
FROM cte 
WHERE DATEADD(minute,1,ChangedDate) < NextDate 
) 

SELECT ChangedDate, 
     SomeValue 
FROM cte 
ORDER BY ChangedDate 
OPTION (MAXRECURSION 0) 

Для вашего образца он будет:

ChangedDate    SomeValue 
2016-09-05 09:50:24.000 20 
2016-09-05 09:51:24.000 20 
2016-09-05 09:52:24.000 20 
2016-09-05 09:53:24.000 20 
2016-09-05 09:54:24.000 20 
2016-09-05 09:55:24.000 20 
2016-09-05 09:56:14.000 18 

Если добавить еще одну строку, как ('2016-09-05 10:00:34', 17), он будет:

ChangedDate    SomeValue 
2016-09-05 09:50:24.000 20 
2016-09-05 09:51:24.000 20 
2016-09-05 09:52:24.000 20 
2016-09-05 09:53:24.000 20 
2016-09-05 09:54:24.000 20 
2016-09-05 09:55:24.000 20 
2016-09-05 09:56:14.000 18 
2016-09-05 09:57:14.000 18 
2016-09-05 09:58:14.000 18 
2016-09-05 09:59:14.000 18 
2016-09-05 10:00:14.000 18 
2016-09-05 10:00:34.000 17 

Если вам нужен этот журнал продлится до тока время изменения части:

p.ChangedDate as NextDate 

в КТОС на этом:

COALESCE(p.ChangedDate,GETDATE()) as NextDate 
Смежные вопросы