我正在使用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排序2件事
我尝试过
LAG(job_location) over (partition by person_id order by as_of_date)
,如果temp_asgn按时间顺序仅存在1行,则该方法有效,但是要携带的值可以有任意数量的“ temp_asgn”行。
我也尝试过 first_value / last_value,但分区不起作用。在分区中包括temp_asgn列意味着有两个分区而不是一个分区,并且不包括temp_asgn只是按时间顺序使我获得了第一个/最后一个值。
一般的解决方案会有所帮助,此表中有几列必须根据是否填充了temp_asgn来执行。
答案 0 :(得分:1)
将临时位置更改为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)