这里是理货表版本。
设置一些虚拟的数据:
/*
CREATE TABLE MyTable
(
MyDate DATETIME,
Status varchar(10)
)
INSERT INTO Mytable VALUES ('2009-01-01 12:00:00','OK')
INSERT INTO Mytable VALUES ('2009-01-01 12:03:00','FAILED')
INSERT INTO Mytable VALUES ('2009-01-01 12:04:00','OK')
INSERT INTO Mytable VALUES ('2009-01-01 12:06:20','OK')
INSERT INTO Mytable VALUES ('2009-01-01 12:07:35','FAILED')
INSERT INTO Mytable VALUES ('2009-01-01 12:07:40','FAILED')
INSERT INTO Mytable VALUES ('2009-01-01 12:20:40','FAILED')
INSERT INTO Mytable VALUES ('2009-01-01 12:25:40','OK')
*/
设置值和paramters。我将所有内容硬编码了10分钟,但这也可能是一个参数。
DECLARE
@StartAt datetime
,@Through datetime
SET @StartAt = 'Jan 1, 2009'
SET @Through = getdate() -- or whenever
然后查询。这仅在存在要列出的数据时才列出行;使其成为内部连接以列出没有活动的“时隙”。
;WITH
-- Itzik Ben-Gan's tally table routine
Pass0 as (select 1 as C union all select 1), --2 rows
Pass1 as (select 1 as C from Pass0 as A, Pass0 as B),--4 rows
Pass2 as (select 1 as C from Pass1 as A, Pass1 as B),--16 rows
Pass3 as (select 1 as C from Pass2 as A, Pass2 as B),--256 rows
Pass4 as (select 1 as C from Pass3 as A, Pass3 as B),--65536 rows
Pass5 as (select 1 as C from Pass4 as A, Pass4 as B),--4,294,967,296 rows
Tally as (select row_number() over(order by C) as Number from Pass5)
(...在“理货表”或“号码表”中查找讨论什么,和为什么这背后...的)
select
xx.FromTime
,sum(case when mt.Status = 'OK' then 1 else 0 end) HowManyOk
,sum(case when mt.Status = 'Failed' then 1 else 0 end) HowManyFailed
from (select
dateadd(mi, (Number-1) * 10, @StartAt) FromTime
,dateadd(mi, Number * 10, @StartAt) ThruTime
from Tally where Number <= datediff(mi, @StartAt, @Through) /10) xx
inner join MyTable mt
on mt.MyDate >= xx.FromTime and mt.MyDate < xx.ThruTime
group by xx.FromTime
所以我的问题是:所有提出的方法,随着数据量的增加,规模越大?我希望有人测试这个。
你说每隔10分钟,但例子显示每15 .. – 2010-02-18 22:39:00