hi这是我在impala中的查询。我需要将其转换为蜂窝
Select count(*)
FROM ud_planning.WIM_MF2_Temp as MF
LEFT JOIN
ud_planning.WIM_PDA_Temp as PDA
on PDA.materialnum = MF. materialnum
and MF.loaddate between PDA.FromDate and PDA.Todate
结果:61664421行。
我的蜂窝版本:
Select count(*)
FROM ud_planning.WIM_MF2_Temp as MF
LEFT JOIN
ud_planning.WIM_PDA_Temp as PDA
on PDA.materialnum = MF. materialnum
where (MF.loaddate >= PDA.FromDate and MF.loaddate <= PDA.Todate)
or PDA.materialnum is null
结果:59184964行。
如何在不丢失行的情况下写这篇文章?
您可以将筛选条件移动到where
子句:
Select count(*)
from ud_planning.WIM_MF2_Temp MF left join
ud_planning.WIM_PDA_Temp PDA
on PDA.materialnum = MF.materialnum and
MF.loaddate >= PDA.FromDate and
MF.loaddate <= PDA.Todate;
哦,这是您的第一个查询——由于on
子句中的不等式,我认为它在Hive中不起作用。
在您试图相加的两个表之间有三种可能的条件:
- 材质匹配,时间框架匹配
- 材料匹配,有时间框架,但没有匹配
- 没有材料匹配
您的第二个查询只得到(1(和(3(。第二个问题相当棘手,因为没有on
子句的灵活性。您可以使用进行计算
select count(*)
from (select count(*)
from ud_planning.WIM_MF2_Temp MF join
ud_planning.WIM_PDA_Temp PDA
on PDA.materialnum = MF.materialnum
group by MF.materialnum
having sum(case when MF.loaddate >= PDA.FromDate and MF.loaddate <= PDA.Todate then 1 else 0 end) = 0
) MF;
尽管我认为这在Hive中不起作用,但另一种配方是:
select count(*)
from ud_planning.WIM_MF2_Temp MF
where not exists (select 1
from ud_planning.WIM_PDA_Temp PDA
where PDA.materialnum = MF.materialnum and
MF.loaddate >= PDA.FromDate and MF.loaddate <= PDA.Todate
);
这些给了你可以添加回来的差异。