5

購入時間情報を含むテーブルがあります。(ユーザーが何かを購入する...)

5 分の間隔を持つタイム ラインを作成する必要があり、この 5 分間のウィンドウでカウントする必要があります - 購入 (カウント) が行われた回数 - (ユーザーごとのグループは必要ありません))

開始点 = @startCheckingTime 値が 08:00:00 の場合

終点=一日の終わり。(が であっても 翌日 未満 であっても構いませんxx:59:5900:00:00)

テーブルは次のとおりです。

DECLARE @startCheckingTime DATETIME 
SET @startCheckingTime='2010-01-01 08:00:00'
declare @t table 
(
    d   DATETIME 
)

INSERT INTO  @t
SELECT   '2010-01-01 08:02:00'
UNION ALL
SELECT   '2010-01-01 08:04:00'
UNION ALL
SELECT   '2010-01-01 08:05:00'
UNION ALL
SELECT   '2010-01-01 08:06:00'
UNION ALL
SELECT   '2010-01-01 08:07:00'
UNION ALL
SELECT   '2010-01-01 08:12:00'

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

08:05:00    |   3  //in the last 5 min we had 3 purchases
08:10:00    |   2
08:15:00    |   1

質問 :

これを行うには、08:00:00 から 1 日の終わりまでのすべての時間間隔を持つ一時テーブル (またはテーブル変数) を作成する必要がありますか? (参加による)

または、これはすべての可能な値を含むテーブルの助けを借りずに行うことができます

ありがとう。

ps 値が xx:05:00 に正確にある場合、すべてのアイテムで同じである限り、それがどのウィンドウに属しているかは問題ではありません

4

2 に答える 2

3

これを試して:

select dateadd(minute, m * 5, 0) as d,
       count(*) as c
from (
      select datediff(minute, 0, d) / 5 as m
      from @t
      where d >= @startCheckingTime and
            d < dateadd(day, 1, cast(@startCheckingTime as date))
      ) T
group by m
order by m
于 2012-07-22T19:00:41.027 に答える
3

これは最も自然なことではありませんが、除算で分を平坦化することにより、時間間隔でユーティリティ テーブルを使用することができます。

SELECT 
    DATEPART(hour, d) as Hour, 
    (DATEPART(minute, d) / 5) * 5 as Minute, 
    COUNT(*) as Purchases
FROM Times
GROUP BY DATEPART(hour, d), DATEPART(minute, d) / 5
ORDER BY DATEPART(hour, d), DATEPART(minute, d) / 5

これは基本的な考え方を示しています。開始時刻を含めて、1 日だけをカバーするように制限するのは簡単です。

作業中の SqlFiddle

于 2012-07-22T17:53:54.893 に答える