Вы можете попробовать что-нибудь по этому коду:
Заполнить сценарий макета
SET DATEFORMAT ymd;
DECLARE @mockTable TABLE([date] DATE,[time] TIME,[comp/H] DECIMAL(20,5));
INSERT INTO @mockTable VALUES
('2019-09-10','07:01',13640.416015625)
,('2019-09-10','07:02',8970.3193359375)
,('2019-09-10','07:03',6105.4990234375)
,('2019-09-10','07:04',7189.77880859375)
,('2019-09-10','07:08',2266.73657226563)
,('2019-09-10','07:57',163.527984619141);
- Отфильтровать его за один день (только чтобы все было просто ...)
DECLARE @TheDate DATE='20190910';
- запрос
WITH CountMinutes(Nmbr) AS
(
SELECT TOP((SELECT DATEDIFF(MINUTE,MIN([time]),MAX([time]))
FROM @mockTable
WHERE [date]=@TheDate)+1) ROW_NUMBER() OVER(ORDER BY (SELECT NULL))-1
FROM master..spt_values
)
SELECT @TheDate AS [date]
,CAST(DATEADD(MINUTE,mc.Nmbr,(SELECT MIN(t.[time]) FROM @mockTable t WHERE t.[date]=@TheDate)) AS TIME) AS [time]
,t2.[comp/H]
FROM CountMinutes mc
LEFT JOIN @mockTable t2 ON t2.[date]=@TheDate AND t2.[time]=CAST(DATEADD(MINUTE,mc.Nmbr,(SELECT MIN(t.[time]) FROM @mockTable t WHERE t.[date]=@TheDate)) AS TIME);
Идея вкратце:
Нам нужна таблица подсчета , просто список бегущих чисел,Я использую master..spt_values
, который является не чем иным как предварительно заполненной таблицей с большим количеством строк.Вы можете выбрать любую существующую таблицу с достаточным количеством строк, чтобы охватить диапазон.Нам не нужны значения строки, только счетчик для набора.Вы также можете прочитать о таблицах подсчета и о том, как создать их в комбинации VALUES()
и CROSS JOIN
.Волшебство здесь - это комбинация вычисленного предложения TOP()
и ROW_NUMBER()
.
Так что CTE вернет список чисел, отражающих количество минут.
Выбор будет использовать этоlist и DATEADD()
для создания без пробела списка значений времени.Теперь мы должны LEFT JOIN
ваш набор, чтобы увидеть данные, где есть данные ...