SQL-在填充另一列时结转派生的列值

时间:2019-04-10 04:16:10

标签: sql teradata

我正在使用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来执行。

1 个答案:

答案 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)