2009-04-16 91 views
11

我有一张带时间戳的表格。什么是适当的查询来获得最后一小时的每分钟记录计数。TS SQL - 按分组划分

I.e.如果现在是2:25,我想知道1点25分到1点26分,1点26分和1点27分有多少记录,所以我有60个结​​果。从表

回答

19

这将在最后一小时

返回结果的数量为每分钟(这里你有记录)
SELECT DATEPART(n, time_stamp) AS minute, COUNT(*) as results 
FROM table_name 
WHERE time_stamp > DATEADD(hh, -1, GETDATE()) 
GROUP BY DATEPART(n, time_stamp) 

这可能会返回少于60个结果,具体取决于数据。如果必须有60个结​​果,则查询稍有不同。这将使用公用表表达式生成60号的列表和相关子查询来获取为每分钟结果:

WITH numbers (num) AS (
    SELECT 1 UNION ALL 
    SELECT 1 + num FROM numbers WHERE num < 60) 
SELECT num AS minute, 
    (SELECT COUNT(*) AS results 
    FROM table_name 
    WHERE DATEPART(n, time_stamp) = num 
    AND time_stamp > DATEADD(hh, -1, GETDATE()) 
FROM numbers 

要查看结果,替换DATEADD(HH,-1,GETDATE() )与DATEADD(mi,-15,GETDATE()),你会得到最后15分钟的结果和其他分钟的0。

+0

看起来是正确的,谢谢。 – 2009-04-16 22:34:35

+0

很高兴帮助。你需要保证查询每次返回60条记录吗? – 2009-04-16 22:37:30

+0

不,不需要,谢谢 – 2009-04-16 22:46:53

-1

SELECT COUNT(TS),其中间(开始时间,结束时间)TABLE.TS

+0

谢谢,但这会给我总计数,或者我必须运行它60次。我需要一个查询来给我每分钟的总数。 – 2009-04-16 22:15:41

3

当你编辑的问题,我编辑我的答案。如果我对你有正确的理解,你只想看看过去的一小时 - 也就是从请求到当前时间的一小时前的时间。这是我该怎么做:

SELECT 
    COUNT(yourTimeStamp) 
FROM yourTable 
WHERE DATEADD('hh', -1, GetDate()) <= yourTimeStamp 
    AND yourTimeStamp < GetDate() 
GROUP BY DATEPART('mm', yourTimeStamp) 

我不完全确定的语法是确切的。当在MSSQL中编码时,我会在当前时间使用CURRENT_TIMESTAMPMINUTE而不是DATEPART等,但是您会得到解决方案的想法。

+0

+1为答案。这不完全是我需要的,所以我会重新解释这个问题。谢谢。 – 2009-04-16 22:20:01

+0

另外,没有HOUR和MINUTE,但是DATEPART。 – 2009-04-16 22:25:56

2

DATEPART是你在找什么:

declare @times table 
(
    someTime datetime 
) 

INSERT INTO @Times (sometime) values ('jan 12 2008 12:23') 
INSERT INTO @Times (sometime) values ('jan 12 2008 12:34') 
INSERT INTO @Times (sometime) values ('jan 12 2008 12:35') 
INSERT INTO @Times (sometime) values ('jan 12 2008 12:25') 
INSERT INTO @Times (sometime) values ('jan 12 2008 12:02') 
INSERT INTO @Times (sometime) values ('jan 12 2008 12:09') 
INSERT INTO @Times (sometime) values ('jan 12 2008 12:35') 


select DATEPART(mi,sometime) AS Minute, count(*) AS NumOccurances 
from @Times 
WHERE SomeTime BETWEEN @Lower AND @Upper 
GROUP BY DATEPART(mi, sometime) 
order by NumOccurances DESC 

结果:

Minute NumOccurances 
35 2 
2 1 
9 1 
23 1 
25 1 
34 1 
+0

这比Tomas的答案要好,因为使用了Hour()或等价物,因为当数据集有一天以上时,结果会产生误导。请记住,这是包容性的,在这种情况下,通常情况下表达时间> =较低,有时<较高。 – rfusca 2009-04-16 22:32:19

+0

我的观点显然是应该分开考虑的日期的所有部分都需要考虑在内。我刚刚写了一个小时作为例子,并认为很明显,还需要考虑日,月和年。 – 2009-04-16 22:54:44

0

这是我发现的一种替代方法,用于确定每分钟插入或更新多少条记录。预先将日期格式作为变量的好处是,您可以轻松地将其更改为每小时分析一次。希望这可以帮助!

DECLARE @dateFormat as varchar(max) = 'yyyy-MM-dd HH:mm' 

SELECT format(timeColumn, @dateFormat) AS minute, COUNT(*) as results 
FROM yourTable 
WHERE timeColumn > DATEADD(hh, -1, GETDATE()) 
GROUP BY format(timeColumn, @dateFormat) 
ORDER BY 1