SQL 在同一行上迭代
SQL iterating on same row
我正在寻找 SQL 代码来执行此操作:
tab_input
ID
Dat
A
a
7
3
a
6
4
a
5
1
b
2
5
b
3
9
b
1
2
我想计算一个新的列B[i] = A[i] + B[i-1],但是当ID改变时字段B被重置
tab_output
ID
Dat
A
B
a
5
1
1
a
6
4
5
a
7
3
8
b
1
2
2
b
2
5
7
b
3
9
16
我尝试了以下方法:
select
A
, A + lag( B, 1) OVER( partition by id order by dat ) as B
FROM(
select
ID, A, 0 as B
FROM tab_input
) as base
;
但是不行,结果是
ID
Dat
A
B
a
5
1
1
a
6
4
4
a
7
3
3
b
1
2
2
b
2
5
5
b
3
9
9
我认为它是把0的值加到所有的值上,并没有更新B的值
非常感谢你的帮助!
LAG
查看一行(默认为当前行之前的一行)。你为每一行创建一个为 0 的 B,然后你查看 LAG(b)
,但 b 在前一行中也为 0;它在所有行中都是 0。您期望一些递归开始,但事实并非如此。
你要找的是一个累计数(SUM OVER
):
SELECT id, dat, a, SUM(a) OVER (PARTITION BY id ORDER BY dat) AS b
FROM tab_input
ORDER BY id, dat;
我正在寻找 SQL 代码来执行此操作:
tab_input
ID | Dat | A |
---|---|---|
a | 7 | 3 |
a | 6 | 4 |
a | 5 | 1 |
b | 2 | 5 |
b | 3 | 9 |
b | 1 | 2 |
我想计算一个新的列B[i] = A[i] + B[i-1],但是当ID改变时字段B被重置
tab_output
ID | Dat | A | B |
---|---|---|---|
a | 5 | 1 | 1 |
a | 6 | 4 | 5 |
a | 7 | 3 | 8 |
b | 1 | 2 | 2 |
b | 2 | 5 | 7 |
b | 3 | 9 | 16 |
我尝试了以下方法:
select
A
, A + lag( B, 1) OVER( partition by id order by dat ) as B
FROM(
select
ID, A, 0 as B
FROM tab_input
) as base
;
但是不行,结果是
ID | Dat | A | B |
---|---|---|---|
a | 5 | 1 | 1 |
a | 6 | 4 | 4 |
a | 7 | 3 | 3 |
b | 1 | 2 | 2 |
b | 2 | 5 | 5 |
b | 3 | 9 | 9 |
我认为它是把0的值加到所有的值上,并没有更新B的值
非常感谢你的帮助!
LAG
查看一行(默认为当前行之前的一行)。你为每一行创建一个为 0 的 B,然后你查看 LAG(b)
,但 b 在前一行中也为 0;它在所有行中都是 0。您期望一些递归开始,但事实并非如此。
你要找的是一个累计数(SUM OVER
):
SELECT id, dat, a, SUM(a) OVER (PARTITION BY id ORDER BY dat) AS b
FROM tab_input
ORDER BY id, dat;