首页 > 解决方案 > SQL查询仅显示最近日期的非重复行和重复行

问题描述

所以我有两个表(比如说 x 和 y)。两个表中的大部分数据都是重复的,但有些行是不同的。我将这两个表中的全部数据插入到一个新表中(比如说 table_mixed)。有一列表示表的日期,例如 x 为 20190307,y 为 20190308 因此,对于任何重复的行,都会有一个不同的日期列。

num        Code     col1 col2 col3.....  import_date    file_date   
-------- ---------  -----------------   ----------   ----------
01         AA       ......                20190308          20190307      
01         AA       ......                20190308          20190308      
02         AA       ......                20190308          20190307      
03         BB       ......                20190308          20190308      

我想要做的是,我想查询一个数据,以便从两个表中显示一个非重复行,对于任何重复的行,只显示一个最近日期的行。

我做了一些发现,我试过这个:

select *,max(file_date) over (partition by stx_import_date) max_date 
from table_mixed;

其中 file_date 是一个日期,它告诉每个表的不同日期,并且两个表中的每一行都具有相同的 import_date。

num        Code     col1 col2 col3......  import_date    file_date     max_date 
-------- ---------         ------------     ----------  ----------
01         AA       ......                20190308        20190307     20190308
01         AA       ......                20190308        20190308     20190308
02         AA       ......                20190308        20190307     20190307
03         BB       ......                20190308        20190308     20190308

此查询的结果显示每一行(包括所有重复的行)并添加另一列 (max_date),该列仅显示每行的最近 file_date。但我希望结果只显示我上面提到的内容,而不是额外的列(max_date)。

这是我正在寻找的结果:

num        Code     col1 col2 col3...  import_date  file_date   
-------- ---------    ------------    ----------   --------   
01         AA       ......            20190308        20190308      
02         AA       ......            20190308        20190307      
03         BB       ......            20190308        20190308      

谢谢

PS不仅需要复制的列编号,代码和导入日期,还有我的其他列.....所以,我的意思是重复行>>除file_date之外的每一列(我有10多列)

PS2 我编辑了这个例子,所以你们想误会我的意思。还有其他列(如 col1、col2、col3 等)也使用了。在这种情况下我应该如何使用分区

标签: sqlhive

解决方案


您似乎关心该num列并且只想要最新的数据。您可以使用混合表执行此操作:

select tm.*
from (select tm.*,
             row_number() over (partition by num, code, . . . order by file_date desc) as seqnum
      from table_mixed
     ) tm
where seqnum = 1;

注意:如果文件日期相同,则将选择任意行。

当您创建混合表时,这样做可能更有效。你可以这样做:

select y.*
from y
union all
select x.*
from x left join
     y
     on x.num = y.num and
        x.code = y.code and
        . . .
where y.num is null;

这将返回y(最近的)中的所有行以及来自x(并假设所有列值都不是NULL)的任何不匹配的行。


推荐阅读