2

SQL Serverに、イベントとイベントのを格納するテーブルがありますdatetime。現在、これらのイベントを10分間隔でグループ化して、各グループのイベント数を示しています。

次のような結果を探しています。誰かがこれをどのように行うことができるかについての例を持っていますか?

    FromTIme                | ToTime                  | Number of Events
    -----------------------------------------------------------------------
    2012-12-03 00:00:00.000 | 2012-12-03 00:10:00.000 |     5
    2012-12-03 00:10:00.000 | 2012-12-03 00:20:00.000 |    15

クエリはレポートで使用されるので、間隔の@StartDateとを設定できるようにしたいと思います。@EndDate

4

1 に答える 1

6

あなたはこれを行うことができます:

DECLARE @startDate DATETIME = '2012-12-03 00:00:00.000';
DECLARE @endDate   DATETIME = '2012-12-03 00:20:00.000';
DECLARE @counter INT = 1;
DECLARE @nOfIntervals INT = DATEDIFF(minute, @startDate, @endDate) / 10;

;WITH Temp
AS
(
    SELECT n
    FROM (VALUES(0), (1), (2), (3), (4), (5), (6), (7), (8), (9)) Nums(n)
), Numbers
AS
(
    SELECT n = t2.n * 10 + t1.n + 0
    FROM Temp t1
    CROSS JOIN Temp t2
), FromToCTE
AS
(
    SELECT  
      DATEADD(minute, 10 * n, @startDate) FromDate, 
      DATEADD(minute, 10 *(n +1), @startDate) ToDate
    FROM numbers 
    WHERE (n + 1) <= @nOfIntervals
 ),EventsFromTo
 AS
 (
     SELECT 
       c.FromDate,
       c.ToDate,
       e.EventDate
     FROM @Events e
     INNER JOIN FromToCTE c ON e.EventDate BETWEEN c.FromDate AND c.ToDate
 )  
 SELECT FromDate, ToDate, COUNT(*) "Number of Events"
 FROM EventsFromTo
 GROUP BY FromDate, ToDate;

ライブデモ

これにより、次のような結果が得られます。

     FromDate                 ToDate          Number of Events
2012-12-03 00:00:00     2012-12-03 00:10:00          5
2012-12-03 00:10:00     2012-12-03 00:20:00          15 

これはどのように作動しますか?

0 から 9 までの数字の一時テーブルをアンカー テーブルとして使用しました。

SELECT n
FROM (VALUES(0), (1), (2), (3), (4), (5), (6), (7), (8), (9)) Nums(n)

0 から 99 までの数値を生成するには:

Numbers
AS
(
    SELECT n = t2.n * 10 + t1.n + 0
    FROM Temp t1
    CROSS JOIN Temp t2
 )

からまでNumbersの時間間隔を生成するためにこの表を使用しました。2 つの日付の差は 99 分間隔を超えないと仮定しました。クエリを 99 を超える範囲で機能させたい場合は、テーブル temp をさらに複数回クロス結合して、より多くの数値を生成します。後で、これらの生成された数値を使用して、それぞれの間隔が 10 分である日時間隔を生成しました。その後、この生成されたテーブルをイベント日付フィールドのテーブルと結合しました。で、完了です。@startDate@endDateEventsGROUP BYCOUNT

注:@startDate 2つのパラメーターを使用してクエリに渡された日付の差が@EndDate10分で割り切れるかどうかは確認していません。あなたの場合はこれを確認する必要があると思います。宿題として残しますあなた。

これは大変な作業かもしれませんが、カーソルを使わずにこれを行う簡単な方法が見つかりませんでした

于 2012-12-03T12:40:58.350 に答える