如何创建滚动计算理论?附SQL Fiddle表结构示例
滚动计算TVD(垂深)的SQL实现方案
嘿,我看了你提供的TVD表结构和测点数据,想要实现滚动计算累计垂深对吧?先帮你理清楚逻辑,再给出具体的SQL实现。
首先,先把你提供的表结构和初始数据整理成规范的SQL代码块:
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); -- 后续测点数据可按此格式继续补充
滚动计算的核心逻辑
定向井垂深(TVD)的滚动计算,最常用的是平均角法,逻辑非常直观:
- 单段垂深增量 = 当前测点与前一测点的测深差 × 两段倾角平均值的余弦值
- 累计垂深 = 从初始测点到当前测点的所有垂深增量之和(滚动累加)
你的表已经存储了incl(当前测点倾角)和incl_prev(前一测点倾角),而且都是弧度值,刚好可以直接用SQL的COS()函数计算余弦值。
SQL实现代码
利用SQL Server的窗口函数SUM() OVER()就能轻松实现滚动累加,具体代码如下:
SELECT PK, MSR AS 当前测深, MSR_PREV AS 前一测深, incl AS 当前倾角_弧度, incl_prev AS 前一倾角_弧度, -- 计算当前段的垂深增量 CASE WHEN PK = 1 THEN 0.0 -- 初始测点无前置段,增量为0 ELSE (MSR - MSR_PREV) * COS( (incl + incl_prev) / 2 ) END AS 垂深增量, -- 滚动累加得到累计垂深 SUM( CASE WHEN PK = 1 THEN 0.0 ELSE (MSR - MSR_PREV) * COS( (incl + incl_prev) / 2 ) END ) OVER (ORDER BY PK) AS 累计垂深_TVD FROM TVD ORDER BY PK;
代码说明
- 初始测点(PK=1)的垂深增量设为0,累计垂深也为0,符合实际的初始状态。
SUM() OVER (ORDER BY PK)会自动按照PK的顺序,累加从第一个测点到当前测点的所有垂深增量,完美实现滚动计算的效果。- 如果需要更精确的计算方式(比如考虑方位角变化的最小曲率法),可以随时告诉我,我再帮你调整公式。
内容的提问来源于stack exchange,提问作者arcee123
相关产品推荐
相关产品推荐

