5

我有一张包含购买时间信息的表格。(用户买了一些东西......)

我需要创建一个间隔为 5 分钟的时间线,我需要在这 5 分钟的窗口中计算 - 进行了多少购买(计数) - (不需要按用户分组))

起点 = @startCheckingTime 其值为 08:00:00

终点=一天的结束。(如果 :或小于第二天 at无关紧要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 到一天结束的所有时间间隔?(通过加入)

或者,这可以在没有包含所有可能值的表格的帮助下完成

谢谢。

ps 如果一个值恰好在 xx:05:00 ,它属于哪个窗口并不重要,只要它对所有项目都相同

4

2 回答 2

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

这显示了基本思想。包括开始时间并将其限制为仅涵盖一天很简单。

工作SqlFiddle

于 2012-07-22T17:53:54.893 回答
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 回答