我正在寻找一种方法来编写SQL查询,将第一个离散的差异应用于最初的系列。通过使用Pandas的.diff()
方法,在Python中这是非常容易的:
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(0,100,size=(10, 2)), columns=list('AB'))
df["diff_A"]=df["A"].diff()
df["diff_B"]=df["B"].diff()
print(df)
我想要的输出在"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解决方案。
发布于 2018-01-09 09:23:49
您可以使用解析迟滞函数:
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中的数据集是无序的.对于滞后()中的确定性结果,始终使用充分的ORDER子句。(如果不存在此类字段,则应在插入到SQL数据集中的数据时/之前创建一个字段。SQL数据集的无序特性允许大量的可伸缩性选项和优化选项可用。)
发布于 2018-01-09 10:10:13
我之所以发布这个答案,仅仅是因为我能够在一个SQLFiddle中复制结果,然后是在接受的答案中的注释。除了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;
https://stackoverflow.com/questions/48164751
复制相似问题