我有两张桌子,范围或限制表
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
需要很长时间,所以我想有更好的方法可以做到这一点。
答案 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