2011-09-27 57 views
3

我有一個表像這樣的:有沒有辦法來GROUP BY在此表中的時間間隔?

DateTime A 

10:00:01 2 
10:00:07 4 
10:00:10 2 
10:00:17 1 
10:00:18 3 

這是可能創造一個返回我一個每10秒的平均值的查詢?在這種情況下結果將是:

3 (4+2)/2 
2 (2+1+3)/3 

在此先感謝!

編輯:如果你真的認爲這不能剛做完說NO WAY! :)這是一個可以接受的答案,我真的不知道這是否可以完成。

EDIT2:我使用的是SQL Server 2008中我想有不同的分組,但固定的。例如,範圍各10秒,1分鐘,5分鐘,30分鐘,1小時,1天(只是一個例子,但類似的東西)

+1

您使用的是什麼RDBMS?你也只是想從'x0-x9'固定分組?這些小組不是以您的數據爲條件? –

+0

我想有不同的分組,但修復。例如,範圍每10秒,1分鐘,5分鐘,30分鐘,1小時和1天(只是一個示例,但類似的) –

+0

您的示例結果數學與您的輸入值不匹配。 3在解釋中,但不在輸入值中。 – OCary

回答

4

在SQL Server中,您可以按小時,分鐘和秒整數除法使用DATEPART然後組10

CREATE TABLE #times 
(
    thetime time, 
    A int 
) 

INSERT #times 
VALUES ('10:00:01', 2) 
INSERT #times 
VALUES ('10:00:07', 4) 
INSERT #times 
VALUES ('10:00:10', 2) 
INSERT #times 
VALUES ('10:00:17', 1) 
INSERT #times 
VALUES ('10:00:18', 3) 

SELECT avg(A) -- <-- here you might deal with precision issues if you need non-integer results. eg: (avg(a * 1.0) 
FROM #times 
GROUP BY datepart(hour, thetime), DATEPART(minute, thetime), DATEPART(SECOND, thetime)/10 

DROP TABLE #times 
+0

看起來像一個很好的解決方案,謝謝! –

+0

我目前正在使用這種方法。謝謝 –

+1

如果您所做的數據超過1天,1個月或1年,請務必在相應的分組條款中添加其他數據,否則所有1點,2點,3點的數據以及所以每天都會被組合成一個。 GROUP BY datepart(year,thetime),datepart(month,thettime),datepart(day,thettime),datepart(hour,thettime),datepart(minute,thetime),datepart(SECOND,thetime)/ 10 – RyanfaeScotland

1

有人可能到來,給你完整的代碼的答案,但這樣我會接近這個是把它分解到幾個較小的問題/解決方案:

(1)間隔創建臨時表。看到這個問題,接受的答案:

Get a list of dates between two dates

這個答案是對MySQL,但是應該讓你開始。谷歌搜索「創建間隔SQL」還應該產生額外的方式來實現這一點。你會想從你的主表使用MAX(日期時間)和MIN(日期時間)的投入,無論您使用的方法(和10秒的跨度,很明顯)。

(2)加入臨時表與主表,用(僞)的連接條件:

FROM mainTable m INNER JOIN #tempTable t ON m BETWEEN t.StartDate AND t.EndDate 

(3)現在應該是簡單的正確選擇和分組:

SELECT 
    AVG(m.A)  
FROM 
    mainTable m 
    INNER JOIN #tempTable t ON m BETWEEN t.StartDate AND t.EndDate 
GROUP BY 
    t.StartDate 

編輯:如果您想要查看沒有記錄(零均值)的間隔,則必須重新查詢,使用LEFT JOIN和COALESCE on mA(請參見下文)。如果你不關心看到這樣的interals,OCary的解決方案是更好/更清潔。

SELECT 
    AVG(COALESCE(m.A, 0)) 
FROM 
    #tempTable t 
    LEFT JOIN mainTable m ON m BETWEEN t.StartDate AND t.EndDate 
GROUP BY 
    t.StartDate 
1

這取決於您正在使用的DBMS。 在Oracle中,你可以做到以下幾點:

SELECT AVG(A) 
FROM MYTABLE 
GROUP BY to_char(DateTime, 'HH24:MI') 
+0

你知道這是否可以轉化爲Oracle? –

+0

這是Oracle的。 –

1
CREATE TABLE IF NOT EXISTS `test` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `dtime` datetime NOT NULL, 
    `val` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 


INSERT INTO `test` (`id`, `dtime`, `val`) VALUES 
(1, '2011-09-27 18:36:19', 8), 
(2, '2011-09-27 18:36:21', 4), 
(3, '2011-09-27 18:36:27', 5), 
(4, '2011-09-27 18:36:35', 3), 
(5, '2011-09-27 18:36:37', 2); 

SELECT *, AVG(val) FROM test GROUP BY FLOOR(UNIX_TIMESTAMP(dtime)/10) 
+0

這是mysql,對不起,我把它寫得比你放在這裏更早一點。 – diNord

1

我通過使用通用表達式來獲取我的數據的任何給定日期之間的所有時間段。原則上可以將間隔更改爲任何SQL間隔。

DECLARE @interval_minutes INT = 5, @start_date DATETIME = '20130201', @end_date DATETIME = GETDATE() 

;WITH cte_period AS 
(
    SELECT CAST(@start_date AS DATETIME) AS [date] 

    UNION ALL 

    SELECT DATEADD(MINUTE, @interval_minutes, cte_period.[date]) AS [date] 
    FROM cte_period 
    WHERE DATEADD(MINUTE, @interval_minutes, cte_period.[date]) < @end_date 
) 

, cte_intervals AS 
(SELECT [first].[date] AS [Start], [second].[date] AS [End] 
FROM cte_period [first] 
LEFT OUTER JOIN cte_period [second] ON DATEADD(MINUTE, 5, [first].[date]) = [second].[date] 
) 

SELECT i.[Start], AVG(data) 
FROM cte_intervals i 
LEFT OUTER JOIN your_data mu ON mu.your_date_time >= i.Start and mu.your_date_time < i.[End] 
GROUP BY i.[Start] 
OPTION (MAXRECURSION 0) 
+0

不錯的想法,不幸的是該項目現在關閉。無論如何,我保留它以備將來參考。 –

0

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=142634您可以使用下面的查詢,以及:

select dateadd(minute, datediff(minute, 0, timestamp)/10 * 10, 0), avg (value) 
from yourtable 
group by dateadd(minute, datediff(minute, 0, timestamp)/10 * 10, 0) 

其中有人則在擴展建議:

Select 
a.MyDate, 
Start_of_10_Min = 
dateadd(mi,(datepart(mi,a.MyDate)/10)*10,dateadd(hh,datediff(hh,0,a.Mydate),0)) 
from 
(-- Test Data 
select MyDate = getdate() 
) a 

雖然我不是他們也計劃如何在第二個建議中獲得平均值。

我個人更喜歡OCary's answer,因爲我知道那裏發生了什麼,我可以在6個月的時間內瞭解它,而無需再次查看,但爲了完整性,我將其包括在內。

相關問題