SQL 按范围加入
SQL join by range
我有两个 table,table 个范围或限制
id min max
A -3 -2
B -2 -1
C -1 10
和 table 数据
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
我的 table(显然)比那些大,所以这个 query
需要很长时间,所以我想有更好的方法。
假设您的限制包括在内:
select
data.name, data.value, limits.id
from
data, limits
where
data.value >= limits.min and
data.value <= limits.max
试试这个:
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
这三种方法都使用交叉连接/笛卡尔积,然后过滤结果以强制执行limits/rules。
如果数据 table 非常大,那么使用这三种方法中的任何一种都将得到一个巨大的交叉 product/cartesian 产品。
这是一个不同的想法。我们通过案例陈述来强制执行限制。我认为这个 运行 应该和 "select * from data":
一样快
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 的分布式特性。您能否就交叉连接与案例之间的性能差异给我一些反馈?
我有两个 table,table 个范围或限制
id min max
A -3 -2
B -2 -1
C -1 10
和 table 数据
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
我的 table(显然)比那些大,所以这个 query
需要很长时间,所以我想有更好的方法。
假设您的限制包括在内:
select
data.name, data.value, limits.id
from
data, limits
where
data.value >= limits.min and
data.value <= limits.max
试试这个:
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
这三种方法都使用交叉连接/笛卡尔积,然后过滤结果以强制执行limits/rules。
如果数据 table 非常大,那么使用这三种方法中的任何一种都将得到一个巨大的交叉 product/cartesian 产品。
这是一个不同的想法。我们通过案例陈述来强制执行限制。我认为这个 运行 应该和 "select * from data":
一样快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 的分布式特性。您能否就交叉连接与案例之间的性能差异给我一些反馈?