当列中具有不同值时如何连接 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|
+---------+---+---+
我有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|
+---------+---+---+