SQL查询仅显示非重复的行,并且仅显示最近日期以来的重复的行

时间:2019-03-10 09:32:38

标签: sql hive

所以我有两个表(假设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多个列)之外的每一列

P.S.2我编辑了示例,以便您想让我理解。还有其他列(例如col1,col2,col3等)也可以使用。在这种情况下,我应该如何使用分区方式

3 个答案:

答案 0 :(得分:0)

使用row_number窗口功能。

  • num,code,import_date..etc 列上进行分区。
  • file_date desc
  • 上订购

示例查询:

Select * from (
select *,row_number() over (partition by num,code,stx_import_date order by file_date desc) row_number
from table_mixed)t
where t.row_number = 1;

答案 1 :(得分:0)

您似乎在乎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)。

答案 2 :(得分:0)

也许通过区分日期字段的MAX()进行区分?

;WITH get_max_dt AS (
    SELECT TM.[num]
    ,   TM.[Code]
    ,   TM.[import_date]
    ,   MAX(TM.[file_date]) AS [file_date]
    FROM table_mixed AS TM
    GROUP BY TM.[num],TM.[Code],TM.[import_date]

)
SELECT *
FROM get_max_dt

输出:

num  Code  import_date  file_date
01   AA    20190308     20190308
02   AA    20190308     20190307
03   BB    20190308     20190308