0

特定の期間 (通常は 15 分) の間に含まれるレコードの数を数えようとしていますが、この間隔を変数にしたいと考えています。私のテーブルには datetime 列があり、2 つの日付間の 15 分間隔ごとにレコード数のカウントを取得する必要があり、15 分のウィンドウにレコードがない場合は、その期間がゼロである必要があります。CTE をさまざまな組み合わせで使用しようとしましたが、機能しませんでした。CTE を使用して日付系列を生成できますが、結果の実際のデータを取得できませんでした。WHILE ループを含むストアド プロシージャを使用した実用的なソリューションがあります。可能であればこれを回避するか、よりエレガントなソリューションを望んでいました。

一時テーブルを使用した作業ループは次のとおりです。

declare @record_count int = 0
declare @end_date_per_query datetime
create table #output (
    SessionIdTime datetime,
    CallCount int)
while @date_from < @date_to
begin   
    set @end_date_per_query = DATEADD(minute, @interval, @date_from)
    select @record_count = COUNT(*) from tbl WHERE SessionIdTime between @date_from and @end_date_per_query
    insert into #output values (@date_from, @record_count)
    set @date_from = @end_date_per_query
end
select * from #output order by sessionIdTime
drop table #output

誰かがよりエレガントなソリューションを手伝ってくれることを願っています。どんな助けでも大歓迎です。

4

2 に答える 2

1

CTEは問題なく機能します。

-- Parameters.
declare @Start as DateTime = '20120901'
declare @End as DateTime = '20120902'
declare @Interval as Time = '01:00:00.00' -- One hour.  Change to 15 minutes.
select @Start as [Start], @End as [End], @Interval as [Interval]

-- Sample data.
declare @Sessions as Table ( SessionId Int Identity, SessionStart DateTime )
insert into @Sessions ( SessionStart ) values
  ( '20120831 12:15:07' ), ( '20120831 21:51:18' ),
  ( '20120901 12:15:07' ), ( '20120901 21:51:18' ),  
  ( '20120902 12:15:07' ), ( '20120902 21:51:18' )  
select * from @Sessions

-- Summary.    
; with SampleWindows as (
  select @Start as WindowStart, @Start + @Interval as WindowEnd
  union all
  select SW.WindowStart + @Interval, SW.WindowEnd + @Interval
    from SampleWindows as SW
    where SW.WindowEnd < @End
  )
  select SW.WindowStart, Count( S.SessionStart ) as [Sessions]
    from SampleWindows as SW left outer join
      @Sessions as S on SW.WindowStart <= S.SessionStart and S.SessionStart < SW.WindowEnd
    group by SW.WindowStart
于 2012-09-04T00:04:06.767 に答える
0

これはあなたが探しているものですか?

-- setup
DECLARE @interval INT, @start DATETIME
SELECT @interval = 15, @start = '1/1/2000 0:00:00'
DECLARE @t TABLE (id INT NOT NULL IDENTITY(1,1) PRIMARY KEY, d DATETIME)
INSERT INTO @t (d) VALUES
 (DATEADD(mi, @interval * 0.00, @start)) -- in
,(DATEADD(mi, @interval * 0.75, @start)) -- in
,(DATEADD(mi, @interval * 1.50, @start)) -- out

-- query
DECLARE @result INT
SELECT @result = COUNT(*) FROM @t
WHERE d BETWEEN @start AND DATEADD(mi, @interval, @start)

-- result
PRINT @result
于 2012-09-03T22:49:40.657 に答える