我有一张带时间戳的表格。什么是适当的查询来获得最后一小时的每分钟记录计数。TS SQL - 按分组划分
I.e.如果现在是2:25,我想知道1点25分到1点26分,1点26分和1点27分有多少记录,所以我有60个结果。从表
我有一张带时间戳的表格。什么是适当的查询来获得最后一小时的每分钟记录计数。TS SQL - 按分组划分
I.e.如果现在是2:25,我想知道1点25分到1点26分,1点26分和1点27分有多少记录,所以我有60个结果。从表
这将在最后一小时
返回结果的数量为每分钟(这里你有记录)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。
SELECT COUNT(TS),其中间(开始时间,结束时间)TABLE.TS
谢谢,但这会给我总计数,或者我必须运行它60次。我需要一个查询来给我每分钟的总数。 – 2009-04-16 22:15:41
当你编辑的问题,我编辑我的答案。如果我对你有正确的理解,你只想看看过去的一小时 - 也就是从请求到当前时间的一小时前的时间。这是我该怎么做:
SELECT
COUNT(yourTimeStamp)
FROM yourTable
WHERE DATEADD('hh', -1, GetDate()) <= yourTimeStamp
AND yourTimeStamp < GetDate()
GROUP BY DATEPART('mm', yourTimeStamp)
我不完全确定的语法是确切的。当在MSSQL
中编码时,我会在当前时间使用CURRENT_TIMESTAMP
,MINUTE
而不是DATEPART
等,但是您会得到解决方案的想法。
+1为答案。这不完全是我需要的,所以我会重新解释这个问题。谢谢。 – 2009-04-16 22:20:01
另外,没有HOUR和MINUTE,但是DATEPART。 – 2009-04-16 22:25:56
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
这比Tomas的答案要好,因为使用了Hour()或等价物,因为当数据集有一天以上时,结果会产生误导。请记住,这是包容性的,在这种情况下,通常情况下表达时间> =较低,有时<较高。 – rfusca 2009-04-16 22:32:19
我的观点显然是应该分开考虑的日期的所有部分都需要考虑在内。我刚刚写了一个小时作为例子,并认为很明显,还需要考虑日,月和年。 – 2009-04-16 22:54:44
这是我发现的一种替代方法,用于确定每分钟插入或更新多少条记录。预先将日期格式作为变量的好处是,您可以轻松地将其更改为每小时分析一次。希望这可以帮助!
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
看起来是正确的,谢谢。 – 2009-04-16 22:34:35
很高兴帮助。你需要保证查询每次返回60条记录吗? – 2009-04-16 22:37:30
不,不需要,谢谢 – 2009-04-16 22:46:53