SQL范围连接

时间:2015-11-04 00:39:25

标签: sql hive hiveql

我有两张桌子,范围或限制表

id min max
A   -3  -2
B   -2  -1
C   -1  10

和数据表

name value
c1     1.5
c2    -1.2
c3    -2.3
c4     0.3

我想要的结果如下:

name value id
c1     1.5  C
c2    -1.2  B
c3    -2.3  A
c4     0.3  C

这是怎么做的?

更新

我尝试过的代码如下:

select m.*
n.*
from m
join n 
on m.value between n.min and n.max

我的表格(显然)大于那些,所以这个query需要很长时间,所以我想有更好的方法可以做到这一点。

3 个答案:

答案 0 :(得分:1)

假设您的限制是包容性的:

select 
   data.name, data.value, limits.id
from 
   data, limits 
where
   data.value >= limits.min and
   data.value <= limits.max

答案 1 :(得分:1)

这三种方法都使用交叉连接/笛卡尔积,然后过滤结果以强制执行限制/规则。

如果数据表非常大,那么您将使用这三种方法中的任何一种获得巨大的产品/笛卡尔积。

这是一个不同的想法。我们使用案例陈述强制执行限制。我认为这个应该和#34; select * from data&#34;:

一样快
select 
   name, value, 
   case 
     when value > -3  and value <= -2  then 'A' 
     when value > -2  and value <= -1  then 'B' 
     when value > -1  and value <=  10 then 'C'
   end as id 
from data
where value > -3 and value <=10

我编辑过滤掉超出限制的值。我的猜测是,它应该在hive / MR上下文中快速运行,因为filter + case方法非常适合hive的分布式特性。你可以给我一些关于你在交叉联接与案例之间的表现差异的反馈吗?

答案 2 :(得分:0)

试试这个:

select
   dat.name
   ,dat.value
   ,lmt.id
from test_data dat
cross join test_limits lmt
where dat.value > lmt.min 
   and dat.value < lmt.max
order by
dat.name