首页 > 解决方案 > 使用分析或其他函数从现有列中派生新列值的 Oracle SQL 操作?我已经描述了想要的结果

问题描述

我有三列 ELEMENT、START_POSITION 和 FIELD_LENGTH,并试图在不使用任何函数的情况下派生列 SKIPPED(new column)。

例子:

ELEMENT  START_POSITION    FIELD_LENGTH 
     
  A            4                9
  B           14               10
  C           24               10
  D           36                8

使用这两列,我尝试派生名为 SKIPPED 的列。

逻辑解释:

第一行包含 ELEMENT 'A' & START_POSITION as 4,这意味着 A 应该从第 4 个位置开始,所以 SKIPPED 值应该是 3。由于 'A'(第一行)的 FIELD_LENGTH 是 9,它应该在第 12 个位置结束

第二行有ELEMENT 'B',START_POSITION 为14,WHHICH MEANS SKIPPED 应该是1,因为ELEMENT 'A' 结束于第12 位,ELEMENT 'B 的START_POSITION 是14,即跳过第13 位,所以START_POSITION 是14

同样,第三行的 ELEMENT 'C' 和 START_POSITION 为 24,因为 ELEMENT 'B' 从第 14 位开始并且 FIELD_LENGTH 为 10,所以它(ELEMENT B)在第 23 位结束。C 具有 SKIPPED 值“0”,因为它在第 23 个位置之后立即开始并且 START_POSITION 为 24

基于上述逻辑,我需要从 ELEMENT 的 START_POSITION 和 FIELD_LENGTH 导出 SKIPPED 的值。

同样对于 ELEMENT 'D'

我的目标是获得以下输出。

ELEMENT  START_POSITION    FIELD_LENGTH  SKIPPED

  A            4                9          3
  B           14               10          1
  C           24               10          0
  D           36                8          2

标签: sqloracle

解决方案


你想要lag()和算术:

select t.*,
       (start_position -
        lag(start_position + field_length, 1, 1) over (order by start_position)
       ) as skipped
from t;

这使用 3 参数形式lag()。第三个参数是默认值。


推荐阅读