2017-04-11 45 views
1

希望有人可以协助如何修改以下SQL以实现所需输出中显示的结果。我不熟悉TSQL,但知道足够了解这一点。
我的目标是将我的事件数据和组计为从午夜开始的15分钟时间段,但在特定时间段中没有事件数据时也包括零(0)。将事件分组分成5分钟的时间段

CURENT查询#

;With cte As 
(SELECT CONVERT (varchar(5),DATEADD(minute, 15 * 
    (DATEDIFF(minute, '20000101', I.CreateTimestamp)/15), '20000101'),108) 
    AS CreationTime, I.IncidentShortReference AS Ref 
FROM Incident I 
WHERE i.CreateTimestamp between DATEADD(d,-1,GETDATE()) and GETDATE() 
) 
SELECT CTE.CreationTime, count(CTE.Ref) As Count 
FROM cte CTE 
GROUP BY CTE.CreationTime 
ORDER BY CTE.CreationTime 

我的结果

CreationTime count 
00:15   2 
01:00   1 
01:15   1 
01:30   1 
01:45   2 
02:00   1 
02:15   1 
02:30   4 
(Truncated) 

所需的输出

CreationTime count 
00:15   2 
00:30   0 
00:45   0 
01:00   1 
01:15   1 
01:30   1 
01:45   2 
02:00   1 
02:15   1 
02:30   4 
02:45   0 
03:00   0 
(Truncated) 
+0

包括样本数据和期望的输出 –

+2

您的数据只在同一天?如果不是,那么在2天内同一时间呢? – TriV

+0

即使计数我不明白它来自哪里..这只是一个粗略的结果 –

回答

1

这在每个范围与样本数据使用CTE创造了昨天的每时间戳午夜之间,现在的记录,具有计数事件的数量:

从随机间隔
declare @incident table (CreateTimestamp datetime, IncidentShortReference varchar(5)) 
insert into @incident values ('4/10/2017 11:11:00', 'test') 
insert into @incident values ('4/10/2017 11:12:00', 'test') 
insert into @incident values ('4/10/2017 11:21:00', 'test') 
insert into @incident values ('4/10/2017 11:31:00', 'test') 
insert into @incident values ('4/10/2017 13:31:00', 'test') 

DECLARE @dt datetime 
SELECT @dt = dateadd(d, datediff(d, 0, getdate()), 0) - 1 -- yesterday at midnight 

;with cte as 
(
select @dt dt 
union all 
select DATEADD(minute, 15, dt) as Next15 
FROM cte 
WHERE DATEADD(minute, 15, dt) < GETDATE() 
) 
select convert(varchar(5), dt, 108) as CreationTime, (select count(*) FROM @incident WHERE CreateTimestamp >= dt and CreateTimestamp < dateadd(mi, 15, dt)) as count 
from cte 

输出样本:

table

+0

这完全按照需要工作。 我需要包含 选项(maxrecursion 0)来防止Maxiumum递归错误 – cramar

1

您可以创建一个时间间隔CTE表像this

WITH TIME_CTE 
AS(
    SELECT 
     CAST('20170411 00:15:00' AS DATETIME) AS TimePeriod 
    UNION ALL 
    SELECT 
     DATEADD(MINUTE, 15, TimePeriod) 
    FROM TIME_CTE 
    WHERE 
     DATEADD(MINUTE, 15, TimePeriod) < CAST('20170411 23:59:00' AS DATETIME) 
) 

SELECT 
    LEFT(CONVERT(VARCHAR(10),TimePeriod,108), 5) 
FROM TIME_CTE 

然后用你的原始查询加入它

WITH TIME_CTE 
AS(
    SELECT 
     CAST('20170411 00:15:00' AS DATETIME) AS TimePeriod 
    UNION ALL 
    SELECT 
     DATEADD(MINUTE, 15, TimePeriod) 
    FROM TIME_CTE 
    WHERE 
     DATEADD(MINUTE, 15, TimePeriod) < CAST('20170411 23:59:00' AS DATETIME) 
), 
CTE 
AS (
SELECT CONVERT (varchar(5),DATEADD(minute, 15 * 
    (DATEDIFF(minute, '20000101', I.CreateTimestamp)/15), '20000101'),108) 
    AS CreationTime, I.IncidentShortReference AS Ref 
FROM Incident I 
WHERE i.CreateTimestamp between DATEADD(d,-1,GETDATE()) and GETDATE() 
) 

SELECT TIME_CTE.TimePeriod, SUM(IIF(CTE.Ref IS NULL, 0, 1)) As Count 
FROM TIME_CTE 
    LEFT JOIN CTE ON CTE.CreationTime = TIME_CTE.TimePeriod 
GROUP BY TIME_CTE.TimePeriod 
ORDER BY TIME_CTE.TimePeriod