4

最初のasp.netWebアプリを完成させようとしていますが、難しい問題が発生しました。Webアプリは、全国のさまざまな場所でネットワークデバイスをテストし、応答時間を記録するように設計されています。Windowsサービスは、これらのデバイスを定期的に、通常は1〜10分ごとにチェックします。各チェックの結果は、この設計でSQLServerテーブルに記録されます。(デバイスがダウンしている場合、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日15:20-3:
42
PM2012/12/20 1:00 AM-9:00 AM

私の理解の限りでは、もちろん特定のDeviceIDについて、NULLResponseTimesの各ブロックの開始と終了のStatusTimeを取得する必要があります。GoogleとStackOverflowでいくつか検索しましたが、私がやろうとしていることに似たものは見つかりませんでした。(適切な検索用語を使用していない可能性があります。)経験豊富なプログラマーである兄は、SQL ServerでCURSORを使用できる可能性があると提案しましたが、CURSORのパフォーマンスはひどいので、スケジュールされたタスク。何かお勧めはありますか?

4

1 に答える 1

1
declare  @DeviceStatuses table(

[DeviceStatusID] INT      IDENTITY (1, 1) NOT NULL,
[DeviceID]       INT      NOT NULL,
[StatusTime]     DATETIME NULL,
[ResponseTime]   INT      NULL)


Insert into @DeviceStatuses([DeviceID],[StatusTime],[ResponseTime])
Values
(1,'20120101 10:10',2),(1,'20120101 10:12',NULL),(1,'20120101 10:14',2),
(1,'20120102 10:10',2),(1,'20120102 10:12',NULL),(1,'20120102 10:14',2),
(2,'20120101 10:10',2),(2,'20120101 10:12',NULL),(2,'20120101 10:14',2),
(2,'20120101 10:19',2),(2,'20120101 10:20',NULL),(2,'20120101 10:21',NULL),(2,'20120101 10:22',2),
(2,'20120102 10:10',2),(2,'20120102 10:12',NULL),(2,'20120102 10:14',2);

Select [DeviceID],MIN([StatusTime]) as StartDown,MAX([StatusTime]) as EndDown
from
(
Select [DeviceID],[StatusTime]
,(Select MAX([StatusTime]) from @DeviceStatuses s2 where s2.DeviceID=s1.DeviceID and s2.StatusTime<s1.StatusTime and s2.ResponseTime is not null) as gr
from @DeviceStatuses s1
where s1.ResponseTime is null
)a
Group by [DeviceID],gr
order by [DeviceID],gr
于 2013-01-04T10:10:19.720 に答える