首页 > 解决方案 > postgresql在列移位时在行之间减去

问题描述

我有一个像这样的简单表

date            day0   day1   day2   day3
2020-01-01         3      2      1     -1
2020-01-02         2      3      1      0
2020-01-03         4      1     -1      2
2020-01-04         5      2      0      1

我想在第(i + 1)天减去昨天的行到第(i)天的今天行。例如,如果今天是 2020-01-02,则预期结果应该是

date         day0    day1    day2    day3
2020-01-02      0      -2      -2     NaN

0(day0)由 2(从 2020-01-01 day1)获得 - 2(从 2020-01-02 day0)
-2(day1)由 1(从 2020-01-01 day2)获得 - 3 (从 2020 年 1 月 2 日第 1 天开始)
-2(第 2 天)由 -1 获得(从 2020 年 1 月 1 日第 3 天开始)-1(从 2020 年 1 月 2 日第 2 天开始)

我正在考虑选择一个特定的日期及其昨天,然后转置和移动昨天的行,然后在 2 个转置列之间减去。但我认为可能还有另一种优雅的方式。我可以有你的建议吗?

标签: sqlpostgresql

解决方案


您可以LAG()根据您的要求使用如下:

select 
date_,
lag(day1) over (order by date_) -day0 as day0, 
lag(day2) over (order by date_)- day1 as day1, 
lag(day3) over (order by date_) -day2 as day2

from example 

演示

注意:我没有添加列day3,因为问题中没有提供任何逻辑。还考虑到表中只有一个日期条目


推荐阅读