将源与目标中的最新记录进行比较

时间:2019-05-25 16:37:26

标签: sql apache-spark-sql

我想将源表中的记录与目标表中的最新记录(在每个分区中)进行比较

我已经通过在目标中每个分区中创建具有最新记录的临时视图来实现此目的

来源:

id|name|salary|age  
------------------  
1|John|2500|25  
2|Mike|2500|30  

目标:

id|name|salary|age|sdate  
------------------------  
1|John|1500|20|20190215  
1|John|2000|22|20190318 

获取目标中每个分区的最新记录,并将非关键列与源中的相应非关键列进行比较:

CREATE TEMPORARY VIEW latest_rec AS
SELECT id, name, salary, age
FROM ( SELECT id, name, salary, age,
       ROW_NUMBER() OVER (PARTITION BY id ORDER BY sdate DESC) AS RN
       FROM target_tab) tt
WHERE tt.RN = 1
...
SELECT s.id, s.name, s.salary, s.age
FROM src_tab s
LEFT OUTER JOIN latest_rec t
ON s.id = t.id
AND MD5(s.name || s.salary || s.age) <> MD5(t.name || t.salary || t.age) 

预期输出:

id|name|salary|age|sdate  
1|John|1500|20|20190215  
1|John|2000|22|20190318
1|John|2500|25|20190525
2|Mike|2500|30|20190525

我想知道是否有更好和更聪明的方法来实现相同的功能。如果需要其他信息,请告诉我。 谢谢

1 个答案:

答案 0 :(得分:0)

您为什么不只使用join并直接进行比较?

SELECT s.id, s.name, s.salary, s.age,
       t.id, t.name, t.salary, t.age
FROM src_tab s LEFT JOIN
     (SELECT id, name, salary, age,
             ROW_NUMBER() OVER (PARTITION BY id ORDER BY sdate DESC) AS RN
      FROM target_tab
     ) tt
     ON tt.id = s.id AND tt.RN = 1
WHERE (s.name <> t.name OR t.name IS NULL) OR
      (s.salary <> t.salary OR t.salary IS NULL) OR
      (s.age <> t.name OR t.age IS NULL) ;

这会将比较结果放在一行中。