【问题标题】:Grouping based on every N days in postgresql在postgresql中基于每N天分组
【发布时间】:2012-10-16 04:08:14
【问题描述】:

我有一个表格,其中包含 ID、日期、值(温度)和其他一些内容。我的表是这样的:

+-----+--------------+------------+
| ID  |  temperature |    Date    |
+-----+--------------+------------+
|  1  |  26.3        | 2012-02-05 |
|  2  |  27.8        | 2012-02-06 |
|  3  |  24.6        | 2012-02-07 |
|  4  |  29.6        | 2012-02-08 |
+-----+--------------+------------+

我想每 10 天执行一次聚合查询,例如 sum 和 mean。

我想知道是否可以在 psql 中使用?

【问题讨论】:

  • “每 10 天”是什么意思?你想要一个移动的窗口吗? 1-10、2-11、3-12 等?或者 1-10、11-20 和 21-31 是否足够好?
  • 我的意思是移动窗口。但是,如果在 psql 中真的不可能,我必须求助于第二个选项。谢谢

标签: postgresql time aggregation window-functions


【解决方案1】:

SQL Fiddle

select
    "date",
    temperature,
    avg(temperature) over(order by "date" rows 10 preceding) mean
from t
order by "date"

【讨论】:

  • 谢谢 Clodoaldo。你的解决方案对我有用。但我还需要每隔 10 天计算一次。就像计算前 10 天,后 10 天的平均值一样。 . .
  • @user1043898 这确实是一个不同的问题,但它已经在其他地方得到了很好的回答。使用 group by extract(epoch from the_date) / extract(epoch from interval '10' day) 。见stackoverflow.com/questions/12921598/…stackoverflow.com/questions/12623358/group-by-data-intervals
  • 很遗憾,我无法执行查询。一种解释是记录是每天的,可以通过每10个ID分组来完成10天分组。但我不知道如何计算每 10 条记录。
【解决方案2】:
select id, 
       temperature, 
       sum(temperature) over (order by "date" rows between 10 preceding and current row)
from the_table;

它可能不是您想要的,因为它会对最后 10 行进行移动总和,这不一定与过去 10 天相同。


从 Postgres 11 开始,您现在可以使用基于间隔的范围

select id, 
       temperature, 
       avg(temperature) over (order by "date" 
                                range between interval '10 days' preceding and current row)
from the_table;

【讨论】:

  • 谢谢,这正是我的意思,但我得到了这个错误:错误:从当前行开始的帧不能有前面的行^
  • @user1043898:抱歉,把限制搞混了。请查看我的编辑。
猜你喜欢
  • 2021-07-02
  • 1970-01-01
  • 2010-11-10
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 2020-10-12
  • 1970-01-01
相关资源
最近更新 更多