1

私は次の表を持っています

table event(
   start_tstamp [datetime],
   stop_tstamp [datetime],
   exe_name [nvarchar](50),
   machine_name [nvarchar](30)
)

このテーブルから、次の形式のstart_tstampstop_tstampの間の時間差ごとに 1 行の情報を含むスカラー テーブルを生成する必要があります。

table event_temp(
   day_occured [datetime],
   hour_occured [tinyint],
   exe_name [nvarchar](50),
   machine_name [nvarchar](30)
)

たとえば、テーブルイベントには 2 行が含まれます

"2012/12/10 07:00", "2012/12/10 09:00", "notepad.exe", "testmachine"
"2012/12/11 15:00", "2012/12/11 18:00", "notepad.exe", "foomachine"

結果のevent_tempは次のようになります

"2012/12/10 00:00", 7, "notepad.exe", "testmachine"
"2012/12/10 00:00", 8, "notepad.exe", "testmachine"
"2012/12/10 00:00", 9, "notepad.exe", "testmachine"
"2012/12/11 00:00", 15, "notepad.exe", "foomachine"
"2012/12/11 00:00", 16, "notepad.exe", "foomachine"
"2012/12/11 00:00", 17, "notepad.exe", "foomachine"
"2012/12/11 00:00", 18, "notepad.exe", "foomachine"

次に、event_tempテーブルと、 event_tempの日付に一致する日付のリストを返す既存のカレンダー テーブルを結合する必要があります。

table calendar(
   day_occured [datetime],
   hour_occured [tinyint],
)

それはちょうど含まれます:

"2012/12/10 00:00", 0
"2012/12/10 00:00", 1
"2012/12/10 00:00", 2
"2012/12/10 00:00", 3
"2012/12/10 00:00", 4
"2012/12/10 00:00", 5
...

結果は基本的に、特定の時間に実行されているメモ帳のインスタンス数のリストになるはずです。

table result(
   day_occured [datetime],
   hour_occured [tinyint],
   instances_running [int]
)

これを達成する方法はありますか?

4

1 に答える 1

1

編集: Clockwork-Muse が指摘したように、私の最後の回答にはいくつかの欠陥がありました。ここに別のアプローチがあります。

ゼロ時間が含まれていない場合...

DECLARE @MinDate datetime = (SELECT TOP 1 start_tstamp FROM [event] ORDER BY start_tstamp ASC)
DECLARE @MaxDate datetime = (SELECT TOP 1 stop_tstamp FROM [event] ORDER BY stop_tstamp DESC)

WITH Dates AS (
    SELECT @MinDate AS dt
    UNION ALL
    SELECT DATEADD(hh, 1, dt)
      FROM Dates s
     WHERE DATEADD(hh, 1, dt) <= @MaxDate)

SELECT 
  CONVERT(date,d.dt,101) AS [day_occured],
  DATEPART(hh, d.dt) AS [hour_occured],
  COUNT(*) AS [instances_running]
FROM @Event e
JOIN Dates d ON e.start_tstamp <= d.dt
        AND e.stop_tstamp  > = d.dt 
GROUP BY d.dt
OPTION (MAXRECURSION 0)

ゼロ時間を含めて...

SET @MinDate = CONVERT(date,@MinDate,101)
SET @MaxDate = CONVERT(date, DATEADD(dd,1,@MaxDate))
SET @MaxDate = DATEADD(MILLISECOND, -2,@MaxDate)

SELECT 
  CONVERT(date,d.dt,101) AS [day_occured],
  DATEPART(hh, d.dt) AS [hour_occured],
  SUM(CASE ISNULL(exe_name,'-1') WHEN '-1' THEN 0 ELSE 1 END ) AS [instances_running]
FROM [event] e
FULL JOIN Dates d ON e.start_tstamp <= d.dt
         AND e.stop_tstamp  >= d.dt 
GROUP BY d.dt
OPTION (MAXRECURSION 0)
于 2012-12-12T20:18:06.913 に答える