2013-02-20 80 views
3

我有一個滑動窗口問題。具體而言,我不知道我的窗口應該從哪裏開始,應該在哪裏結束。我知道我的間隔/窗口的大小。sql滑動窗口 - 在區間內找到最大值

我需要找到提供最佳(或最差,取決於您如何看待它)情況的窗口的開始/結束。

這裏有一個例子數據集:

value | tstamp 
100 | 2013-02-20 00:01:00 
200 | 2013-02-20 00:02:00 
300 | 2013-02-20 00:03:00 
400 | 2013-02-20 00:04:00 
500 | 2013-02-20 00:05:00 
600 | 2013-02-20 00:06:00 
500 | 2013-02-20 00:07:00 
400 | 2013-02-20 00:08:00 
300 | 2013-02-20 00:09:00 
200 | 2013-02-20 00:10:00 
100 | 2013-02-20 00:11:00 

比方說,我知道我需要的時間間隔爲5分鐘。所以,我需要知道「價值」總和最高的5分鐘間隔中包含的價值和時間戳。在我上面的例子中,從'2013-02-20 00:04:00'到'2013-02-20 00:08:00'的行會給我一個400 + 500 + 600 + 500 + 400 = 2400的總和,這是該表中超過5分鐘的最高值。

我不反對如果需要使用多個表。但我試圖找到一個「最好的情況下」間隔。結果可以任何方式,只要他們淨間隔。如果我得到所有的數據點,它仍然有效。如果我得到開始和結束點,我也可以使用這些。

我發現了SQL的幾個滑動窗口問題,但沒有發現窗口大小是已知因素的地方,而且起點不明。

+0

您正在使用哪種RDBMS? – 2013-02-20 21:10:20

+0

我使用的是postgres,目前沒有很多其他選項。 – jasonmclose 2013-02-20 21:12:15

+0

@jasonmclose:哪個版本的PosgreSQL? – Quassnoi 2013-02-20 21:12:38

回答

6
SELECT *, 
     (
     SELECT SUM(value) 
     FROM mytable mi 
     WHERE mi.tstamp BETWEEN m.tstamp - '2.5 minute'::INTERVAL AND m.tstamp + '2.5 minute'::INTERVAL 
     ) AS maxvalue 
FROM mytable m 
ORDER BY 
     maxvalue DESC 
LIMIT 1 
+0

我試過了,我得到了一個結果,但我不知道我在看什麼。你在哪裏根據時間戳創建了你的時間間隔?我在理解查詢時遇到了一些麻煩。 – jasonmclose 2013-02-20 21:32:06

+0

@jasonmclose:對不起,請求錯誤,我認爲你需要5條記錄,而不是5分鐘。請查看新的查詢。 – Quassnoi 2013-02-20 21:35:21

+0

這就是它。這正是我需要它做的。非常感謝你的幫助。 – jasonmclose 2013-02-20 22:09:16