【发布时间】:2011-06-20 21:06:43
【问题描述】:
我有一张表,我正试图从中生成报告。 它基本上是记录什么时候发生故障(发生故障),然后得到修复的日志。
表架构和一些示例数据如下。
举例说明:
下降时插入 1 行
恢复时插入 1 行。
我想做的是报告各个方面,例如:
给定日/周/月的停机时间
在给定的一天/一周/一个月内下降的次数。
理想情况下,可以轻松导出到 Excel 或类似的图形。
我无法提出任何类型的查询来获取此信息。
我有这个例子:
SELECT [Name], datepart(day,[Inserted]), count([SystemDown])
FROM [DownTimeLog]
WHERE [SystemDown]=1
GROUP BY [Name],datepart(day,[Inserted])
这给了我系统每天出现故障的次数,这是一个很好的起点。
但我试图想出一种方法来显示它的总时间,但我正在画一个空白。 例如,有些天可能是 0,有时它可能会下降几次,因此尝试将 2 个对应行之间的时间差相加是很困难的。
CREATE TABLE [dbo].[DownTimeLog]
(
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] VARCHAR(30) NOT NULL,
[SystemDown] BIT NOT NULL,
[Inserted] DATETIME NOT NULL
)
INSERT INTO [DownTimeLog] ([Name],[SystemDown],[Inserted])VALUES('System1',1,'Jun 14 2011 1:49:58:000PM')
INSERT INTO [DownTimeLog] ([Name],[SystemDown],[Inserted])VALUES('System1',0,'Jun 14 2011 2:49:58:000PM')
INSERT INTO [DownTimeLog] ([Name],[SystemDown],[Inserted])VALUES('System1',1,'Jun 15 2011 1:00:00:000PM')
INSERT INTO [DownTimeLog] ([Name],[SystemDown],[Inserted])VALUES('System1',0,'Jun 15 2011 2:00:00:000PM')
INSERT INTO [DownTimeLog] ([Name],[SystemDown],[Inserted])VALUES('System1',1,'Jun 15 2011 4:00:00:000PM')
INSERT INTO [DownTimeLog] ([Name],[SystemDown],[Inserted])VALUES('System1',0,'Jun 15 2011 5:00:00:000PM')
INSERT INTO [DownTimeLog] ([Name],[SystemDown],[Inserted])VALUES('System1',1,'Jun 17 2011 1:00:00:000PM')
INSERT INTO [DownTimeLog] ([Name],[SystemDown],[Inserted])VALUES('System1',0,'Jun 17 2011 3:00:00:000PM')
INSERT INTO [DownTimeLog] ([Name],[SystemDown],[Inserted])VALUES('System1',1,'Jun 18 2011 10:00:00:000AM')
INSERT INTO [DownTimeLog] ([Name],[SystemDown],[Inserted])VALUES('System1',0,'Jun 18 2011 11:00:00:000AM')
INSERT INTO [DownTimeLog] ([Name],[SystemDown],[Inserted])VALUES('System1',1,'Jun 18 2011 1:00:00:000PM')
INSERT INTO [DownTimeLog] ([Name],[SystemDown],[Inserted])VALUES('System1',0,'Jun 18 2011 3:30:00:000PM')
INSERT INTO [DownTimeLog] ([Name],[SystemDown],[Inserted])VALUES('System1',1,'Jun 18 2011 4:00:00:000PM')
INSERT INTO [DownTimeLog] ([Name],[SystemDown],[Inserted])VALUES('System1',0,'Jun 18 2011 8:00:00:000PM')
因此,例如使用上面的数据,我想拉回类似的数据:
系统1 | 2011 年 6 月 14 日 | 1 小时 | 1 次出现
系统1 | 2011 年 6 月 15 日 | 2 小时 | 2次出现的
系统1 | 2011 年 6 月 16 日 | 0 小时 | 0 次出现的
系统1 | 2011 年 6 月 17 日 | 2 小时 | 1 次出现
系统1 | 2011 年 6 月 18 日 | 7.5 小时 | 3次出现的
我希望有人能给我一个方法来做我想做的事情。
-- 编辑:
感谢大家的一些很棒的答案。帮了我一吨。 我认为我的 sql 是很漂亮的字符串,但从未听说过交叉申请 - 我想我需要回到学校!
干杯!
【问题讨论】:
-
您使用的是什么版本的 SQL Server?像this self-join solution 这样的东西可能对你有用。
-
如果系统从晚上 11 点到凌晨 1 点停机,是每天 1 小时,还是第一天 2 小时?
-
如果系统在某一天完全没有宕机,还需要显示0小时的记录吗?
标签: sql sql-server tsql