当列中具有不同值时如何连接 2 个表

How to join 2 tables when it has different values in the column

我有2个table如下。

需要加入这 2 个 table 才能低于 table

我正在尝试不同的连接,但没有得到预期的结果。你能帮我得到想要的 table.

非常感谢您的帮助。

谢谢...

我不知道 scala,但在 pyspark 中你可以执行以下操作:

df1.join(df2, 'DATE', 'full').fillna(0)

基本上你做一个完整的连接并用 0 填充所有的 NULL。

对于 Hive SQL 我想应该是这样的

SELECT Date, 
       CASE WHEN (table1.RM IS NOT NULL) THEN table1.RM ELSE 0 END AS RM, 
       CASE WHEN (table2.KM IS NOT NULL) THEN table2.KM ELSE 0 END AS KM
FROM table1 
FULL JOIN table2 
ON table1.Date = table2.Date

希望这个方案可以帮到你,(我用的是SQL_Server语法)

SELECT isnull(date1,date2) as Date3, ISNULL(RM, 0 ),ISNULL(KM, 0 )
FROM table1 
FULL JOIN table2 
ON table1.Date1 = table2.Date2
order by Date3;

[结果]:

[编辑]: 现场演示

create table Table1 (DATE1 date, RM int);

INSERT INTO Table1 VALUES ('1/4/2020' , 1);
INSERT INTO Table1 VALUES ('2/1/2020' , 4);
INSERT INTO Table1 VALUES ('2/10/2020' , 4);
GO

3 行受影响

create table Table2 (DATE2 date, KM int);

INSERT INTO Table2 VALUES ('2/2/2020' , 1);
INSERT INTO Table2 VALUES ('2/10/2020' , 3);
INSERT INTO Table2 VALUES ('3/5/2020' , 2);
GO

3 行受影响

select * from Table1;
GO
DATE1      | RM
:--------- | -:
2020-01-04 |  1
2020-02-01 |  4
2020-02-10 |  4
select * from Table2;
GO
DATE2      | KM
:--------- | -:
2020-02-02 |  1
2020-02-10 |  3
2020-03-05 |  2
SELECT isnull(date1,date2) as Date3, ISNULL(RM, 0 ),ISNULL(KM, 0 )
FROM table1 
FULL JOIN table2 
ON table1.Date1 = table2.Date2
order by Date3;
GO
Date3      | (No column name) | (No column name)
:--------- | ---------------: | ---------------:
2020-01-04 |                1 |                0
2020-02-01 |                4 |                0
2020-02-02 |                0 |                1
2020-02-10 |                4 |                3
2020-03-05 |                0 |                2

db<>fiddle here

我创建了两个名为 df_rm、df_km 的初始数据框作为您的数据源。

df_rm 看起来像这样:

+---------+---+
|     date| rm|
+---------+---+
| 1/4/2020|  1|
| 2/1/2020|  4|
|2/10/2020|  4|
+---------+---+

df_km:

+---------+---+
|     date| km|
+---------+---+
| 2/2/2020|  1|
|2/10/2020|  3|
| 3/5/2020|  2|
+---------+---+

现在,首先我们可以进行外连接,然后用一些值替换空值,在本例中为 0。

df_km.join(right = df_rm, Seq("date"),joinType = "outer")
      .withColumn("rm",when(col("rm").isNull,0).otherwise(col("rm")))
      .withColumn("km",when(col("km").isNull,0).otherwise(col("km")))
      .show()

输出如下:

+---------+---+---+
|     date| km| rm|
+---------+---+---+
| 3/5/2020|  2|  0|
| 2/2/2020|  1|  0|
| 2/1/2020|  0|  4|
| 1/4/2020|  0|  1|
|2/10/2020|  3|  4|
+---------+---+---+