如果数据不存在,则返回零时隙

时间:2017-02-08 15:09:42

标签: sql sql-server sql-server-2008

我试图每分钟获取两分钟的数据,中间,sid,pid组合应该有每秒数据。如果每个组合的数据不存在一秒,它应该将IC值返回为零。如果中间,sid,pid组合的数据不存在,则两个分钟将有120个时隙,对于任何时隙它应该返回零。这个如果数据不存在,数据用于绘制折线图,​​它应该下降到零。

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 :(得分:1)

你需要一个数字CTE:

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