来源表:
header_id line_id account_type accrual_tier
101 1 expense NULL
101 2 liability TAX
101. 3 Liability Tax
101 4. Liability GYC
102 1 liability C&B
102 2 expense NULL
102 3 expense NULL
102. 4 ASSET ABC
102. 5 OWNERS PQR
102. 6 liability C&B
102. 7 liability DET
预期输出 - 目标表:
header_id line_id account_type accrual_tier
101 1 expense TAX
101 2 liability TAX
101 3 Liability TAX
101 4 liability GYC
102 1 liability C&B
102 2 expense C&B
102. 3 expense C&B
102. 4 ASSET ABC
102. 5 OWNERS PQR
102. 6 liability C&B
102. 7 liability DET
每个标题都有多行,每行都是费用或责任或资产或所有者帐户类型。 accrual_tier
包含除费用外的所有帐户的值。对于'expense'
,它为空。
要求是按相应的accrual_tier
值填充所有类型的accrual_tier
值。
除费用类型外 - 应计值将是具有责任类型的行的应计价值的最大值。
例如,对于标题101,该标题下的最大发生应计值为TAX,因此对于在该标题下具有费用类型的所有行将被指定为TAX。
答案 0 :(得分:0)
您可以使用分析max()
功能查找每个accrual_tier
的责任记录header_id
:
select header_id
, line_id
, account_type
, max(case when account_type = 'liability' then accrual_tier end)
over (partition by header_id) as accrual_tier
from source_table
order by header_id
, line_id
/
或者我们可以使用FIRST_VALUE()函数来解决这个问题,这需要稍微减少输入:):
select header_id
, line_id
, account_type
, first_value (accrual_tier ignore nulls)
over (partition by header_id) as accrual_tier
from source_table
order by header_id
, line_id
/
这是a LiveSQL demo (free Oracle TechNet account required)。
请注意,这两种解决方案都依赖于源数据的关系完整性。如果标题有多行account_type='liability'
,那么您可能会遇到意外的替换。同样,如果有account_type='expense' and accrual_tier is not null
两行都会覆盖原始值的行。
您已修改了您的要求但未完成:您似乎是根据您未在问题中包含的某些条件确定费用accrual_tier
的替代值。所以这可能不是您需要的解决方案,但在发布完整问题之前,这是我能做的最好的事情:
select header_id
, line_id
, account_type
, case when accrual_tier != 'expense' then
accrual_tier
else
last_value (accrual_tier ignore nulls) over (partition by header_id order by accrual_tier)
end as accrual_tier
from source_table
order by header_id
, line_id
/
您标记了问题[infomatica]
,但我无法访问该产品;我假设工作Oracle SQL将解决您的问题。
答案 1 :(得分:0)
1)按header_id排序数据,account_type按降序排序(以确保每个header_id的第一条记录是负债)
2)在表达中做以下事情: