SQL - 在填充另一列时继承派生列值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL - 在填充另一列时继承派生列值相关的知识,希望对你有一定的参考价值。
我正在使用Teradata 16.20。假设我在表格中有以下数据。
这是一个小子集,有十几列和数千个具有多行的用户,每次在用户的列中更改值时,将插入具有特定as_of_dt的新行。它是用户更改的事务日志。
╔══════╦════════════╦══════════════╦═══════════╗
║ User ║ As_Of_DT ║ Job_Location ║ temp_asgn ║
╠══════╬════════════╬══════════════╬═══════════╣
║ ABC ║ 2018.01.01 ║ MT ║ ║
║ ABC ║ 2018.01.15 ║ MT ║ ║
║ ABC ║ 2018.02.01 ║ SD ║ Y ║
║ ABC ║ 2018.03.01 ║ SD ║ Y ║
║ ABC ║ 2018.03.15 ║ MT ║ ║
║ ABC ║ 2018.05.01 ║ TX ║ Y ║
║ ABC ║ 2018.06.01 ║ TX ║ Y ║
║ ABC ║ 2018.07.01 ║ TX ║ Y ║
║ ABC ║ 2018.09.01 ║ MT ║ ║
║ ABC ║ 2019.01.01 ║ AZ ║ ║
║ ABC ║ 2019.02.01 ║ TX ║ Y ║
║ ABC ║ 2019.03.01 ║ AZ ║ ║
╚══════╩════════════╩══════════════╩═══════════╝
需要一个名为Home_Job_Location的新列,其填充如下:
当temp_asgn字段为空时,将Home_Job_Location设置为Job_Location。
否则,在填充temp_asgn之前使用行中的Job_Location值,并在Home_Job_Location中将其前移,直到不再填充temp_asgn。像这样:
╔══════╦════════════╦══════════════╦═══════════════════╦═══════════╗
║ User ║ As_Of_DT ║ Job_Location ║ Base_Job_Location ║ temp_asgn ║
╠══════╬════════════╬══════════════╬═══════════════════╬═══════════╣
║ ABC ║ 2018.01.01 ║ MT ║ MT ║ ║
║ ABC ║ 2018.01.15 ║ MT ║ MT ║ ║
║ ABC ║ 2018.02.01 ║ SD ║ MT ║ Y ║
║ ABC ║ 2018.03.01 ║ SD ║ MT ║ Y ║
║ ABC ║ 2018.03.15 ║ MT ║ MT ║ ║
║ ABC ║ 2018.05.01 ║ TX ║ MT ║ Y ║
║ ABC ║ 2018.06.01 ║ TX ║ MT ║ Y ║
║ ABC ║ 2018.07.01 ║ TX ║ MT ║ Y ║
║ ABC ║ 2018.09.01 ║ MT ║ MT ║ ║
║ ABC ║ 2019.01.01 ║ AZ ║ AZ ║ ║
║ ABC ║ 2019.02.01 ║ TX ║ AZ ║ Y ║
║ ABC ║ 2019.03.01 ║ AZ ║ AZ ║ ║
╚══════╩════════════╩══════════════╩═══════════════════╩═══════════╝
我已经通过as_of_date尝试了两件事
我已经尝试了LAG(job_location) over (partition by person_id order by as_of_date)
,如果按时间顺序只有1行temp_asgn,这是有效的,但是可以有任意数量的“temp_asgn”行来传递值。
我也试过first_value / last_value但是分区不起作用。在分区中包含temp_asgn列意味着有两个分区而不是一个,而不包括temp_asgn只是按时间顺序获取第一个/最后一个值。
一般的解决方案会有所帮助,如果填充了temp_asgn,我必须在这个表中有几个这样的列。
答案
将临时位置更改为NULL并应用LAST_VALUE和IGNORE NULLS选项:
Last_Value(CASE WHEN temp_asgn IS NULL THEN job_location END IGNORE NULLS)
Over (PARTITION BY person_id
ORDER BY as_of_date)
以上是关于SQL - 在填充另一列时继承派生列值的主要内容,如果未能解决你的问题,请参考以下文章