2017-02-08 4 views
0

Я пытаюсь получить данные в течение двух минут каждую минуту, для каждой секунды должны быть данные для mid, sid, pid. если данных нет в течение секунды для каждой комбинации, оно должно возвращать значение IC как ноль. В течение двух минут будет 120 временных интервалов, если данных нет для mid, sid, pid-комбинации для любого временного интервала, который он должен вернуть ноль. Это данные используются для построения линейной диаграммы, если данные отсутствуют, она должна опускаться до нуля.Возврат нуля для временного интервала, если данных нет

CREATE TABLE [dbo].[DeviceData](
[Id] [BIGINT] IDENTITY(1,1) NOT NULL, 
[MId] [INT] NOT NULL, 
[SId] [INT] NOT NULL, 
[PId] [INT] NOT NULL, 
[DataTime] [DATETIME] NOT NULL, 
[IC] [INT] NOT NULL, 
CONSTRAINT [PK_DeviceData] PRIMARY KEY CLUSTERED 
(
[Id] ASC 
) 

SELECT [MId] , 
    [SId] , 
    [PId] , 
    [DataTime] , 
    SUM([IC]) AS Value 
FROM [DeviceData] 
WHERE DataTime BETWEEN DATEADD(MINUTE, -2, GETUTCDATE()) 
      AND  GETUTCDATE() 
GROUP BY [MId] , 
    SID , 
    PId , 
    [DataTime]; 
+1

Создать таблицу справки, которая хранит значения 0 - 120. внешнего соединения. – jarlh

+0

@jarlh или CTE? – JohnHC

+2

Это сложнее, чем кажется. Что происходит, когда у вас есть данные с дробной секундой? Или данные, которые находятся в xx: xx: 00: 00 и xx: xx: 00.999? –

ответ

1

Вам нужен номер КТР:

with Numbers as 
(
select 1 as NN 
union all 
select NN+1 
from Numbers 
where NN < 120 
) 
, Times as 
(
select dateadd(ss, 
       NN, 
       DATEADD(MINUTE, 
         -2, 
         dateadd(ms, 
           -datepart(ms, 
             GETUTCDATE()), 
           GETUTCDATE())) as Timeslot 
from Numbers 
) 
select Timeslot, DD.* 
from Times 
left join DeviceData DD 
    on Timeslot = dateadd(ms, -datepart(ms, GETUTCDATE()),GETUTCDATE()) 
OPTION (MAXRECURSION 1000) -- This will bypass the recursion error 
+0

Спасибо за ваш ответ. Я получил эту ошибку «Утверждение прекращено. Максимальная рекурсия 100 исчерпана до завершения заявки». –

+0

@shijithmc 'maxrecursion' по умолчанию 100, преодолеть это, используя опцию, как указано выше – JohnHC

+0

Спасибо, ее решили, но это не возвращает mid, sid или pid –