Как добавить «пустые» записи за каждую минуту без данных в мой запрос на SQL-сервере - PullRequest
0 голосов
/ 27 сентября 2019

Мой запрос состоит из даты, времени (которое, в основном, является меткой времени) и поля, которое вычисляет стоимость за час.

date        time      comp/H
---------- ----- ----------------------
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

Я хотел бы заполнить пробелы между метками времени, идобавьте новую запись для каждой минуты, для которой не было назначено никаких данных (например, добавьте запись для 07:05, 07:06, 07:07).Я бы назначил значение 0 для поля comp / h для этих записей, но я понятия не имею, как это сделать.

Конечная цель состоит в том, чтобы составить линейный график из приведенных выше данных, в котором можно было бы визуально увидеть время простоя.(отсюда 0 значений для «пустых записей»)

оригинальный запрос:

select cast(p_timestamp as date) as 'datum', CONVERT(VARCHAR(5), p_timestamp, 108) as 'time', avg(((AantalPCBperPaneel*(AantalCP+AantalQP))/deltasec)* 3600) as 'comp/h'
from Testview3
where p_timestamp > '2019-09-01' 
group by CONVERT(VARCHAR(5), p_timestamp, 108), cast(p_timestamp as date)
order by cast(p_timestamp as date) asc , CONVERT(VARCHAR(5), p_timestamp, 108) asc

Ответы [ 2 ]

0 голосов
/ 28 сентября 2019
create or alter function range(@from int, @to int) returns @table table(val int) as
begin
    while @from <= @to begin
        insert @table values(@from)
        set @from = @from + 1;
    end;
    return;
end;

select h.val hour, m.val minute from range(0, 23) h cross join range(0, 59) m;

Это даст вам 1440 рядов за каждую минуту каждого часа дня.Вы можете присоединиться к своим данным, чтобы получить то, что вы хотите.

0 голосов
/ 27 сентября 2019

Вы можете попробовать что-нибудь по этому коду:

Заполнить сценарий макета

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 ваш набор, чтобы увидеть данные, где есть данные ...

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