postgresql在行与列之间进行减法

vaj7vani  于 2021-07-27  发布在  Java
关注(0)|答案(2)|浏览(416)

我有一张这样简单的table

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(第1天)由1(从2020-01-01第2天起)-3(从2020-01-02第1天起)获得
通过-1(从2020-01-01第3天起)-1(从2020-01-02第2天起)获得-2(第2天)
我在考虑选择一个特定的日期和它的“昨天”,然后对“昨天”的行进行换位,然后在两个换位列之间进行减法。但我想可能还有另一种优雅的方式。你能给我一些建议吗?

wj8zmpe1

wj8zmpe11#

如果只需要减去两个日期的值,则可以将表与其自身联接:

select t.date, 
       y.day0 - t.day0 as day0,
       y.day2 - t.day1 as day1,
       y.day3 - t.day2 as day2,
       'NaN'::numeric as day3
from data t
  join data y on y.date = t.date - 1 -- join to the previous date
where t.date = date '2020-01-02'; -- or replace with t.date = current_date

这假设给定日期实际上有一个前一个日期。如果在日期上有差距,那么这就有点复杂了。
在线示例

bgibtngc

bgibtngc2#

你可以用 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 因为这个问题没有逻辑。还考虑到表中只有一个日期条目

相关问题