Python 函数的SQL模拟(第一离散差分)[滞后函数]

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

我正在寻找一种编写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.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;