我有下表:
使用TSQL,我必须将值映射到正确的IDs
例如:值23在1到100之间,所以id = A
我正在尝试以下逻辑:
1。我在T2中添加了一个id列:
id=(row_number() over(order by value asc))
2。声明var:
declare@ as float;
set value (select value from T2 where id=1)
3。确定是否值在范围内并排除其他结果的情况
select * from
(
select
value=@value
,a.*
,test=case when @value between a.start_range and a.end_range then '1' else'2' end
from
T1 a
) a
where
a.test=1
这适用于第一条记录,但是当两个表都超过1000个pe表时,该怎么办?
谢谢
答案 0 :(得分:1)
您可以使用apply
:
select t.value, tt.id
from table t outer apply (
select top (1) t1.id
from table1 t1
where t.v >= t1.s and t.v <= t1.e
order by t1.s
) tt
答案 1 :(得分:1)
除非我丢失了某些内容,否则一个简单的联接查询应该在这里起作用:
SELECT
t2.value,
COALESCE(t1.id, 'NA') AS id
FROM table2 t2
LEFT JOIN table1 t1
ON t2.value BETWEEN t1.[start range] AND t1.[end range];
为了解决@SeanLange提出的问题,我认为这里使用BETWEEN
并不是邪恶的,因为您的范围似乎是完全不重叠的。因此,我们可以在两端设置一个包含范围,这是所需的行为。