2009-04-16 89 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