sql - 使用分析或其他函数从现有列中派生新列值的 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
解决方案
你想要lag()
和算术:
select t.*,
(start_position -
lag(start_position + field_length, 1, 1) over (order by start_position)
) as skipped
from t;
这使用 3 参数形式lag()
。第三个参数是默认值。
推荐阅读
- python - 使用 numpy 组合两个 n 维数组
- pimcore - 如何在 Pimcore 上以不同的语言 csv 导出我的目录?
- elasticsearch - 使用 webhook 自动化 SIEM 响应
- python - 为什么我的程序在我想显示后没有响应?
- php - 如何修复 vagrant 自动使用的 homestead.rb 路径?
- string - 在第二个分隔符 VB NET 之后获取字符串
- c# - C# - Linux 上的 SMTP 邮件发送不起作用
- r - 在 macos 11 Big Sur 上安装 Rserve
- javascript - 重定向平板电脑、移动设备、桌面设备
- grafana - 我可以使用“转换”或类似的东西来计算来自两个不同数据库的结果吗?