Заполните пропущенные значения меток времени в SQL - PullRequest
0 голосов
/ 03 октября 2018

SQL newby здесь ищет небольшую помощь в написании запроса.

Некоторые примеры данных

Time    Value
9:00    1.2
9:01    2.3
9:05    2.4
9:06    2.5

Мне нужно заполнить эти пропущенные времена с нуля - так что запрос будетreturn

Time    Value
9:00    1.2
9:01    2.3
9:02    0
9:03    0
9:04    0
9:05    2.4
9:06    2.5

Возможно ли это в T-SQL?

Спасибо за любую помощь / совет ...

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Вы можете попытаться использовать рекурсивный CTE создать таблицу календаря и OUTER JOIN базу на этом основании.

CREATE TABLE T(
  [Time] Time,
  Value float
);


insert into T values ('9:00',1.2);
insert into T values ('9:01',2.3);
insert into T values ('9:05',2.4);
insert into T values ('9:06',2.5);

Запрос 1 :

with cte as (
 SELECT MIN([Time]) minDt,MAX([Time] ) maxDt
 FROM T
 UNION ALL
 SELECT dateadd(minute, 1, minDt) ,maxDt
 FROM CTE
  WHERE dateadd(minute, 1, minDt) <= maxDt
)
SELECT t1.minDt 'Time',
       ISNULL(t2.[Value],0) 'Value'
FROM CTE t1 
LEFT JOIN T t2 on t2.[Time] = t1.minDt

Результаты :

|             Time | Value |
|------------------|-------|
| 09:00:00.0000000 |   1.2 |
| 09:01:00.0000000 |   2.3 |
| 09:02:00.0000000 |     0 |
| 09:03:00.0000000 |     0 |
| 09:04:00.0000000 |     0 |
| 09:05:00.0000000 |   2.4 |
| 09:06:00.0000000 |   2.5 |
0 голосов
/ 03 октября 2018

Один метод использует рекурсивный CTE для генерации списка раз, а затем использует left join для ввода значений:

with cte as (
      select min(s.time) as time, max(s.time) as maxt
      from sample s
      union all
      select dateadd(minute, 1, cte.time), cte.maxt
      from cte
      where cte.time < cte.maxt
     )
select cte.time, coalesce(s.value, 0)
from cte left join
     sample s
     on cte.time = s.time
order by cte.time;

Обратите внимание, что если у вас есть более 100 минут, вам понадобится option (maxrecursion 0) в конце запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...