2016-09-15 119 views
1

比方说,我有一个表,一时间片这样的:如何在PostgreSQL中获得时间戳的浮动平均值?

CREATE TABLE foo (
    spent_on DATETIME, 
    hours FLOAT 
) 

假设spent_on是时间戳值记录下来,并hours是代表花在工作小时数的浮点值。

如何获得过去7天内小时的平均浮动时间?

我想出了下面的,但它不会工作:

select spent_on, hours, avg(hours) 
over RANGE BETWEEN spent_on - INTERVAL '7 days' AND CURRENT ROW from daily; 

我得到以下错误:

ERROR: syntax error at or near "ROW" 
LINE 1: ... BETWEEN spent_on - INTERVAL '7 days' AND CURRENT ROW from d... 

我试图了解窗口函数的文档,但是我很难在分区,窗口和框架之间抓住这个想法。结果,不能拿出一个查询。

+1

不幸的Postgres目前不支持基于间隔的范围。 –

回答

2

我不知道有关RANGE语法,所以让我提供一个子查询的解决方案(如果性能是无法与小桌子ETC的问题。):

SELECT t.spent_on,t.hours, 
     COALESCE((SELECT AVG(s.hours) FROM foo 
     WHERE t.spent_on > CURRENT_TIMESTAMP - INTERVAL '7 days'),0) float_avg 
FROM foo t 
+0

我试过了。这种工作,但我有空值的问题(一些行包含NULLS)。不知道我怎么可以结合这个'coalesce'调用... – exhuma

+1

立即尝试@exhuma – sagi

+0

哦上帝,我现在觉得这么愚蠢......^_ ^谢谢! – exhuma