【问题标题】:SQL query on a time series to calculate the average时间序列上的 SQL 查询以计算平均值
【发布时间】:2015-04-25 02:04:51
【问题描述】:

我有两张桌子:

温度表,其中包含每 15 分钟获取的温度时间序列

时间表

我需要一个 SQL 查询,这将允许一个平均组 15 分钟 avry 几天的值

谁能帮帮我?

例如:3 天

day1:00:00->10 ; 00:15->11 ;00:30->9......;23:45->12
day2:00:00->9 ; 00:15->2 ;00:30->5......;23:45->4
day3:00:00->8 ; 00:15->10 ;00:30->8......;23:45->5

如何计算:

avarage1 =10+9+8/3
avarage2 =11+2+10/3
avarage3=9+5+8/3
...
avarage96=12+4+5/3

请帮帮我

【问题讨论】:

  • 你为什么不只使用一个timestamp (with or without time zone, depends on your workflow) 来替换所有这些列:years, months, days, hours, minutes, seconds.?
  • 关键细节:是否有每 15 分钟的值,您是否希望在结果中出现一行没有值的时间片?另外:您是要查询完整的表格还是只查询一个(小)选择 - 按哪些条件过滤?最佳查询由此决定。
  • 我每 15 分钟有一个值,我想计算一段时间内每个切片 (de15minutes) 的平均值:
  • 正确的表定义,您尝试的实际查询(即使它不起作用),您的 Postgres 版本 .. 这将是写一个好问题的方式。详情在这里:stackoverflow.com/tags/postgresql-performance/info.

标签: sql postgresql statistics


【解决方案1】:

如果您的测试用例表明了您的真实情况,那么您的时间戳已经精确地以 15 分钟为间隔,您根本不需要 trunc()。只是一个普通的GROUP BY / avg()

SELECT  date_time, avg(value) As avg_val
FROM    temperature te
JOIN    "time" ti USING (id_date)
WHERE   date_time >= '2015-02-24'::date
AND     date_time <  '2015-02-28'::date
GROUP   BY 1;

选择从 '2015-02-24'::date 到 '2015-02-27'::date 的 3 天时间片。请注意我如何包含下限和排除上限。

另外:不要使用保留字“时间”作为标识符。

【讨论】:

    【解决方案2】:

    为每个季度创建一个组,然后使用avg() 聚合函数计算每个组的平均温度:

    select  years
    ,       months
    ,       days
    ,       hours
    ,       floor(minutes / 15)
    ,       avg(value)
    from    Temperature te
    join    Time ti
    on      te.id_date = ti.id
    group by
            years
    ,       months
    ,       days
    ,       hours
    ,       floor(minutes / 15)
    

    或者每季度创建一个组的更明确的替代方法:

    group by
            years
    ,       months
    ,       days
    ,       hours
    ,       case
            when minutes < 15 then 1
            when minutes < 30 then 2
            when minutes < 45 then 3
            else 4
            end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-08
      • 1970-01-01
      • 2017-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多