sql - 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 个转置列之间减去。但我认为可能还有另一种优雅的方式。我可以有你的建议吗?
解决方案
您可以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
,因为问题中没有提供任何逻辑。还考虑到表中只有一个日期条目
推荐阅读
- ios - 在 iOS 中切换位置权限
- angular - 应该使用 ChangeDetectionStrategy.OnPush 来做任何事情吗?
- java - 流处理架构
- python-3.x - Pyspark:如何将火花数据帧转换为 json 并将其保存为 json 文件?
- angular - 模块 '"node_modules/@angular/core/core"' 没有导出的成员 'OpaqueToken'
- javascript - 将多个事件附件反应为 jsx 表达式
- r - 具有不同大小组的 tSNE - 减少数据集或设置困惑 = 最大组?
- windows - CMD环境下PowerShell中的语法问题
- html - 将媒体查询定义为变量
- javascript - Photoshop 中的 Js 比 Chrome 中的慢。我可以更快地制作两个 for 循环吗?