TSQL根据现有范围分配值

时间:2018-06-25 15:41:27

标签: sql sql-server tsql

我有下表:

table 1

table 2

使用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表时,该怎么办?

谢谢

2 个答案:

答案 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并不是邪恶的,因为您的范围似乎是完全不重叠的。因此,我们可以在两端设置一个包含范围,这是所需的行为。