从上一行减去当前行,保持上一行值不变 -- SQL
Subtract current row from previous row, keeping previous row value as constant -- SQL
Table 产品的平均收入
product
avg_rev
A
500
B
400
C
250
D
100
Table product_diff,是我需要计算的地方,diff_a 作为公式 a-a、a-b、a-c、a-d 的另一列。
product
avg_rev
diff_a
A
500
0
B
400
100
C
250
250
D
100
400
到目前为止我的查询:
select product, avg_rev, lag(avg_rev,1) over (order by product) as previous_value from product;
我可以通过说 previous_value-avg_rev
来计算前一行减去当前行之间的差异,但我需要的是前一行保持不变,减去当前行一直沿用下来。
您需要第一个产品的 avg_rev
与当前行的 avg_rev
的差异:
SELECT product,
avg_rev,
FIRST_VALUE(avg_rev) OVER (ORDER BY product) - avg_rev AS diff_a
FROM product;
参见demo。
结果:
product
avg_rev
diff_a
A
500
0
B
400
100
C
250
250
D
100
400
如果您特别想要其中一种产品,我会使用条件逻辑:
select product, avg_rev,
avg_rev - max(case when product = 'A' then avg_rev end) over () as diff_a
from product;
Table 产品的平均收入
product | avg_rev |
---|---|
A | 500 |
B | 400 |
C | 250 |
D | 100 |
Table product_diff,是我需要计算的地方,diff_a 作为公式 a-a、a-b、a-c、a-d 的另一列。
product | avg_rev | diff_a |
---|---|---|
A | 500 | 0 |
B | 400 | 100 |
C | 250 | 250 |
D | 100 | 400 |
到目前为止我的查询:
select product, avg_rev, lag(avg_rev,1) over (order by product) as previous_value from product;
我可以通过说 previous_value-avg_rev
来计算前一行减去当前行之间的差异,但我需要的是前一行保持不变,减去当前行一直沿用下来。
您需要第一个产品的 avg_rev
与当前行的 avg_rev
的差异:
SELECT product,
avg_rev,
FIRST_VALUE(avg_rev) OVER (ORDER BY product) - avg_rev AS diff_a
FROM product;
参见demo。
结果:
product | avg_rev | diff_a |
---|---|---|
A | 500 | 0 |
B | 400 | 100 |
C | 250 | 250 |
D | 100 | 400 |
如果您特别想要其中一种产品,我会使用条件逻辑:
select product, avg_rev,
avg_rev - max(case when product = 'A' then avg_rev end) over () as diff_a
from product;