[英]Multiple averages over evenly spaced intervals
我正在努力學習SQL,所以請耐心等待。 我正在使用PostgreSQL 9.3
我想根據日期窗口平均一列。 我已經能夠編寫窗口函數來實現這個設置interval
但我希望能夠在不斷增長的interval
完成此操作。 我的意思是:
average values from date_0 to date_1
average values from date_0 to date_2
average values from date_0 to date_3
..... so date date_0 stays the same and date_x grows and creates a larger sample
我假設有一種比我想要平均的每個范圍運行查詢更好的方法。 任何建議表示贊賞。 謝謝。
我正在嘗試創建均勻間隔的二進制位,用於聚合表的值。
我來到這個區間:
(MAX(date) - MIN(date)) / bins
其中date
是表的列
和bins
是我想把桌子分成兩部分的箱子。
date_0
= MIN(日期)
date_n
= MIN(日期)+(間隔* n)
我建議使用方便的函數width_bucket()
:
要獲得每個時間段的平均值(“bin”):
SELECT width_bucket(extract(epoch FROM t.the_date)
, x.min_epoch, x.max_epoch, x.bins) AS bin
, avg(value) AS bin_avg
FROM tbl t
, (SELECT extract(epoch FROM min(the_date)) AS min_epoch
, extract(epoch FROM max(the_date)) AS max_epoch
, 10 AS bins
FROM tbl t
) x
GROUP BY 1;
要獲得(逐步)增長時間間隔的“運行平均值”:
SELECT bin, round(sum(bin_sum) OVER w /sum(bin_ct) OVER w, 2) AS running_avg
FROM (
SELECT width_bucket(extract(epoch FROM t.the_date)
, x.min_epoch, x.max_epoch, x.bins) AS bin
, sum(value) AS bin_sum
, count(*) AS bin_ct
FROM tbl t
, (SELECT extract(epoch FROM min(the_date)) AS min_epoch
, extract(epoch FROM max(the_date)) AS max_epoch
, 10 AS bins
FROM tbl t
) x
GROUP BY 1
) sub
WINDOW w AS (ORDER BY bin)
ORDER BY 1;
使用the_date
而不是date
作為列名,避免使用保留字作為標識符。
由於width_bucket()
目前僅針對double precision
和numeric
,因此我從the_date
提取了epoch值。 詳細信息:
在PostgreSQL中聚合(x,y)坐標點雲
如果您有一組數據,則可以在單獨的列中輕松獲得所需的數據:
select avg(case when date between date_0 and date_1 then value end) as avg1,
avg(case when date between date_0 and date_2 then value end) as avg2,
. . .
avg(case when date between date_0 and date_n then value end) as avgn
from table t
where date >= date_0;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.