2013-04-17 27 views
2

讓我試着解釋一下我的意思例如:PostgreSQL有沒有一種方法將結果平均到有限數量的最終結果?

我使用PostgreSQL 9.2.1版本

數據結構如下:

(timedate)date   | (float) data | ... 
"2013-03-23 03:58:00-04" | 66819.59  | ... 
"2013-03-23 03:59:00-04" | 64277.22  | ... 
"2013-03-23 03:59:00-04" | 46841.75  | ... 
"2013-03-23 04:00:00-04" | 69697.38  | ... 
"2013-03-23 04:00:00-04" | 69452.69  | ... 
"2013-03-23 04:01:00-04" | 69697.47  | ... 

我的表有超過500萬個數據點。我已經知道如何在開始和結束日期範圍內獲取數據。

這是我的問題:當範圍太大,比如說它覆蓋整個數據範圍時,它將返回所有500萬行,我想限制它返回的行而不忽略任何數據。

例如,如果我想返回5行,我想第一行是第一百萬行數據的平均值。第二行是第二百萬行數據的平均值等等(顯然這個例子有點極端,我只是誇大地試圖傳達我需要做的)

謝謝你的幫助和建議!

回答

1

如果你想一天平均:

select 
    date_trunc('day', "date")::date "day", 
    avg("data") "data" 
from t 
group by 1 
order by 1 

變化'day''month''week'只要你喜歡。

http://www.postgresql.org/docs/current/interactive/functions-datetime.html#FUNCTIONS-DATETIME-TRUNC

如果你真的想在5塊按日期排序來劃分數據:

select 
    floor(
     (row_number() over(order by "date"))::double precision 
     * 5 
     /(select count(*) from t) 
    ) chunk, 
    avg("data") "data" 
from t 
group by 1 
order by 1 
+0

謝謝你的快速反應,你必須原諒我,我不是在PostgreSQL的專家。你能解釋一下date_trunc()函數之後的部分是什麼嗎? :: date「day」 –

+0

@Philipp':: date'將時間戳記中的'date_trunc'結果轉換爲日期。 '「day」'是給結果集中該列的別名。 –

相關問題