Sql 计算年与年之间月平均值的差异

Sql 计算年与年之间月平均值的差异,sql,postgresql,date,window-functions,Sql,Postgresql,Date,Window Functions,我有一个表,其中包含了过去3年传感器的平均月值 是否有一种方法可以计算2019年的月值和2018年的月值之间的差异,或者创建一个新的表或视图,其中一列包含2018年的日期,另一列包含2019年的日期,第三列包含传感器读数的差异 谢谢 TP假设您的数据没有缺少月份/年份,一个选项使用窗口功能: select t.*, lag(average) over( partition by sensor_id, extract(month from m)

我有一个表,其中包含了过去3年传感器的平均月值

是否有一种方法可以计算2019年的月值和2018年的月值之间的差异,或者创建一个新的表或视图,其中一列包含2018年的日期,另一列包含2019年的日期,第三列包含传感器读数的差异

谢谢


TP

假设您的数据没有缺少月份/年份,一个选项使用窗口功能:

select 
    t.*,
    lag(average) over(
        partition by sensor_id, extract(month from m)
        order by extract(year from m)
    ) last_year_average
from mytable
这会将属于同一传感器和同一月份的所有行放在同一分区中。然后可以使用时间戳的年份部分作为排序列


您可以根据需要使用新列将其与当前平均值进行比较。

假设您的数据没有丢失的月/年,一个选项使用窗口函数:

select 
    t.*,
    lag(average) over(
        partition by sensor_id, extract(month from m)
        order by extract(year from m)
    ) last_year_average
from mytable
这会将属于同一传感器和同一月份的所有行放在同一分区中。然后可以使用时间戳的年份部分作为排序列


您可以根据需要使用新列将其与当前平均值进行比较。

如果您有每个月的值,您可以使用12个月的延迟:

select t.*,
       lag(average, 12) over (partition by sensor_id
                              order by m
                             ) as last_year_average
from t;
将其筛选到2019/2018需要一个子查询:

select t.*
from (select t.*,
             lag(average, 12) over (partition by sensor_id
                                    order by m
                                   ) as last_year_average
      from t
     ) t
where m >= '2019-01-01'::date and
      m < '2020-01-01'::date
其他两种方法是:

select t.sensor_id, month(t.m)
       max(average) filter (where year(t.m) = 2019) as avg_2019,
       max(average) filter (where year(t.m) = 2018) as avg_2018
from t
group by t.sensor_id, month(t.m);
如果可能缺少月份,则安全使用窗口功能:

select t.*,
       max(average) over (partition by sensor_id
                          order by m
                          range between '1 year preceding' and '1 year preceding'
                         ) as average_prev
from t;

如果每个月都有一个值,则可以使用12个月的延迟:

select t.*,
       lag(average, 12) over (partition by sensor_id
                              order by m
                             ) as last_year_average
from t;
将其筛选到2019/2018需要一个子查询:

select t.*
from (select t.*,
             lag(average, 12) over (partition by sensor_id
                                    order by m
                                   ) as last_year_average
      from t
     ) t
where m >= '2019-01-01'::date and
      m < '2020-01-01'::date
其他两种方法是:

select t.sensor_id, month(t.m)
       max(average) filter (where year(t.m) = 2019) as avg_2019,
       max(average) filter (where year(t.m) = 2018) as avg_2018
from t
group by t.sensor_id, month(t.m);
如果可能缺少月份,则安全使用窗口功能:

select t.*,
       max(average) over (partition by sensor_id
                          order by m
                          range between '1 year preceding' and '1 year preceding'
                         ) as average_prev
from t;

谢谢你的所有选择。我是个初学者,有很多东西需要学习。你的第二个选择似乎正是我想要的,但我也在通过其他选择工作。谢谢所有的选择。我是个初学者,有很多东西需要学习。你的第二个选择似乎正是我想要的,但我也在通过其他选择工作。谢谢你的帮助。。再加上下面的选项,你们都帮了我不少忙。。结合下面的选项,你们俩都帮了我很多忙