Python 函数的SQL模拟(第一离散差分)[滞后函数]
我正在寻找一种编写SQL查询的方法,该查询将对原始序列应用第一个离散差分。在Python中,使用Pandas的方法很容易做到这一点: 我想要的输出显示在Python 函数的SQL模拟(第一离散差分)[滞后函数],python,sql,oracle,pandas,difference,Python,Sql,Oracle,Pandas,Difference,我正在寻找一种编写SQL查询的方法,该查询将对原始序列应用第一个离散差分。在Python中,使用Pandas的方法很容易做到这一点: 我想要的输出显示在“diff_A”和“diff_B”列中: A B diff_A diff_B 0 36 14 NaN NaN 1 32 13 -4.0 -1.0 2 31 87 -1.0 74.0 3 58 88 27.0 1.0 4 44 34 -14.0 -54
“diff_A”
和“diff_B”
列中:
A B diff_A diff_B
0 36 14 NaN NaN
1 32 13 -4.0 -1.0
2 31 87 -1.0 74.0
3 58 88 27.0 1.0
4 44 34 -14.0 -54.0
5 2 43 -42.0 9.0
6 15 94 13.0 51.0
7 46 74 31.0 -20.0
8 60 9 14.0 -65.0
9 43 57 -17.0 48.0
我使用Oracle,但我更喜欢干净的ANSI解决方案。IIUC您可以使用分析功能:
with v as (
select rowid as rn, a, b from tab
)
select
a, b,
a - lag(a, 1) over(order by rn) as diff_a,
b - lag(b, 1) over(order by rn) as diff_b
from v
order by rn;
PS最好使用真实的列(如日期)进行排序,因为
例如:
select
a, b,
a - lag(a, 1) over(order by inserted) as diff_a,
b - lag(b, 1) over(order by inserted) as diff_b
from tab;
:
SQL中的数据集是无序的。对于LAG()中的确定性结果 始终使用足够的ORDER BY子句。(如果不存在此类字段,则为一个。) 应在数据插入SQL数据时/之前创建 SQL数据集的无序性允许大量的 可扩展性选项和优化选项可用。)
PS我之所以发布这个答案,仅仅是因为我能够在接受的答案中的评论后面复制结果。除了
rowid
在事实发生后改变之外,还有一个有效的理由说明为什么这个简单的答案不起作用
select
a, b,
a - lag(a, 1) over(order by rowid) as diff_a,
b - lag(b, 1) over(order by rowid) as diff_b
from tab;
并且,按原始序列排序不是必需的期望操作(例如,在测试示例中,它不会产生正确的结果)。应该按日期排序,例如按日期,IIUC:)@MarjanModerc,示例数据集中没有
date
列;-)如果插入顺序是按时间顺序的,您是否应该能够(按rowid排序)
。对于LAG()
中的确定性结果,始终使用足够的ORDER BY
子句。(如果不存在此类字段,则应在将数据插入SQL数据集时/之前创建一个字段。SQL数据集的无序性质允许提供大量的可伸缩性选项和优化选项。)@Spade我同意。我只是在试图与OP沟通时如此详细地评论,以至于他们真的应该在SQL表中添加一个额外的列。Pandas使用隐式排序的数据集,位置可以更改,单个行可以由位置引用,等等。SQL采用了更灵活的方法,允许单个数据集以多个不同的顺序寻址,但是OP负责提供断言确定性顺序所需的字段。我在测试它时遇到了一个愚蠢的语法错误,我误解了来自SQL FIDLE的错误。。。它给了我ORA-04044:此处不允许使用过程、函数、包或类型
而不允许使用表或视图
:(
select
a, b,
a - lag(a, 1) over(order by rowid) as diff_a,
b - lag(b, 1) over(order by rowid) as diff_b
from tab;