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 - 在填充另一列时继承派生列值的主要内容,如果未能解决你的问题,请参考以下文章

添加具有另一列值的 len() 的 DataFrame 列

更新另一列时自动更新sql列

pyspark 将列值与另一列进行比较包含值范围

当用户在 MS Access 中修改表中的另一列时,如何在 SQL Server 中将列设置为今天的日期 [关闭]

PHP / SQL - 获取另一列的总和

SQL - 计算一个列值在另一列中的出现