【发布时间】:2023-04-02 09:37:01
【问题描述】:
我正在完成我的第一个 asp.net 网络应用程序,但遇到了一个难题。该网络应用程序旨在测试全国各地的网络设备并记录响应时间。 Windows 服务会定期检查这些设备,通常每 1-10 分钟一次。然后将每次检查的结果记录在采用这种设计的 SQL Server 表中。 (设备宕机时ResponseTime为NULL。)
CREATE TABLE [dbo].[DeviceStatuses] (
[DeviceStatusID] INT IDENTITY (1, 1) NOT NULL,
[DeviceID] INT NOT NULL,
[StatusTime] DATETIME NULL,
[ResponseTime] INT NULL,
CONSTRAINT [PK_DeviceStatuses] PRIMARY KEY CLUSTERED ([DeviceStatusID] ASC),
CONSTRAINT [FK_DeviceStatuses_Devices] FOREIGN KEY ([DeviceID]) REFERENCES [dbo].[Devices] ([DeviceID])
);
该服务已经运行了几个月,设备数量最少,表大约有 500,000 行。客户希望能够访问每台设备的 3 个月滚动停机时间摘要。大致如下:
停机时间:
2012 年 12 月 11 日下午 3:20 - 下午 3:42
2012 年 12 月 20 日上午 1:00 - 上午 9:00
据我所知,我需要获取每个 NULL 响应时间块的开始和结束的 StatusTime,当然对于特定的 DeviceID。我在 Google 和 StackOverflow 上进行了多次搜索,但没有找到任何类似于我正在尝试做的事情。 (也许我没有使用正确的搜索词。)我的兄弟,一个更有经验的程序员,建议我可以在 SQL Server 中使用 CURSOR,尽管他承认 CURSOR 性能很糟糕,需要一个计划任务。有什么建议吗?
【问题讨论】:
-
看看这个;你可能很幸运:msdn.microsoft.com/en-us/library/hh213234.aspx
-
感谢@JonSeigel,这些函数看起来很有帮助,我希望我知道更多的 SQL 来使用它们。
-
您需要搜索“岛屿和峡谷”。您很幸运,因为 SQL Server 2012 终于有了一些有用的窗口函数可供您使用。
标签: asp.net sql-server sql-server-2012