我正在研究这个提琴:http://sqlfiddle.com/#!18/2f822/1
它具有以下模式和插入:
create table TVD(
PK int
, MSR int
, MSR_PREV int
, ST_MSR int
, azi float
, azi_prev float
, incl float
, incl_prev float
)
insert into TVD values
(1,0,0,0,0,0,0,0),
(2,100,0,0,2.11429185586593,0,0.00523598775598299,0),
(3,200,100,0,2.0612338466053,2.11429185586593,0.00366519142918809,0.00523598775598299),
(4,300,200,0,2.04028989558137,2.0612338466053,0.00174532925199433,0.00366519142918809),
(5,400,300,0,1.00478605037314,2.04028989558137,0.000872664625997165,0.00174532925199433)
前一列是其他列的逻辑上的“前一”值。例如,MSR_PREV是存储在MSR中的值的逻辑“先前”值。ST_MSR是MSR序列的第一个值。
我需要添加一个名为: TVD_VALUE的列。到目前为止,设计是一个未完成的case语句:
case when MSR = MSR_PREV then MSR
else <<PREVIOUS TVD_VALUE>>+((MSR-MSR_PREV)/2)*(COS(INCL_PREV)+COS(INCL))
如何获取前一个计算值来完成“下一条记录”的计算?
谢谢。
发布于 2018-03-31 12:44:10
如果我理解的话,你基本上是在运行你的表达式的总和。您可以使用OVER clause对前面所有行的表达式值求和。
select sum((case when MSR = MSR_PREV then MSR else ((MSR-MSR_PREV)/2)*(COS(INCL_PREV)+COS(INCL)) end))
over(order by MSR rows unbounded preceding) as TVD_VALUE
from TVD
| TVD_VALUE |
|--------------------|
| 0 |
| 99.99931461237134 |
| 199.99829338441333 |
| 299.9978813897484 |
| 399.99778619682525 |
https://stackoverflow.com/questions/49583708
复制相似问题