如何根据最新日期将多个具有不同数据的sql表组合成一个表,如果新数据为空,则保留旧数据?

zynd9foi  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(309)

我想基于五个不同的表创建一个表,而不是所有的表都包含我需要的数据。它们只有两个公共列,我需要根据日期获取最新字段,但是如果其中一个字段包含数据,并且最新字段为空,我需要保留已经存在的内容。这五张表的结构如下。

TABLE_1
system_code 
user_id 
item_id
system_name 
date 

TABLE_2 
user_id
item_id
date 

TABLE_3 
user_id
item_id
date 

TABLE_4
user_id
item_id
system_name
system_version
date 

TABLE_5 
user_id
item_id
system_name
system_version
date

我的输出表需要如下所示:

T_OUTPUT
system_code 
user_id
item_id 
system_name 
system_version
date(latest)

我尝试使用union,但由于某些表不包含system\U名称或system\U版本,因此在使用group by和获取最大日期时会出现重复。此外,如果没有系统名称或系统版本的表具有最新日期,则当前一个日期已经具有来自不同表的系统名称和系统版本时,此字段将为空。例如。

TABLE_1
APL, 1234, asdf, MacOS

TABLE_2 
1234, asdf, 07-20-2020

TABLE_3 
1234, asdf, 07-20-2020

TABLE_4 
1234, asdf, MacOS, Catalina, 07-15-2020

TABLE_5 
1234, asdf, MacOS, NULL, 07-15-2020

输出应该是

APL, 1234, asdf, MacOS, Catalina, 07-20-2020

我还考虑使用一个存储过程合并到目标表中,并根据用户id和项目id进行插入和更新。

kgqe7b3p

kgqe7b3p1#

我想你想要:

with t as (
      select system_code, user_id, item_id, system_name, null as system_version, date
      from table1
      union all
      select null, user_id, item_id, null, null, date
      from table2
      union all
      select null, user_id, item_id, null, null, date
      from table3
      union all
      select null, user_id, item_id, system_name, system_version, date
      from table4
      union all
      select null, user_id, item_id, system_name, system_version, date
      from table5
     )
select t.*
from (select t.*, row_number() over (partition by user_id, item_id order by date desc) as seqnum
      from t
     ) t
where seqnum = 1;

相关问题