表AId  Num
0    0
1    1
2    3
3    6
4    9
5    12
6    15
num 是记录范围的
1-2   对应ID是1
3-5   对应ID是2
6-8   对应ID是3
9-11  对应ID是4
12-14  对应ID是5
15以上     对应ID是6
比如输入num为5 则输出的ID为2
输入num为6 则输出ID为3
请问这样的SQL语句怎么写?谢谢

解决方案 »

  1.   

    直接用num跟你输入的数比较,条件为num小于等于你输入的数,然后取最大的IDSELECT TOP 1 ID FROM tb WHERE num<=你输入的数 ORDER BY NUM DESC
      

  2.   

    select top 1 
    from (
     select Id ,Num from table1 where num<=@param 
    )
    order by Num desc没想到还有更好的方法了
      

  3.   


    --> 测试数据:[test]
    if object_id('[test]') is not null 
    drop table [test]
    create table [test]([Id] int,[Num] int)
    insert [test]
    select 0,0 union all
    select 1,1 union all
    select 2,3 union all
    select 3,6 union all
    select 4,9 union all
    select 5,12 union all
    select 6,15
    --这个方法也可以,不过没这个简单
    declare @min int
    declare @max int
    select @min=Min(num),@max=Max(num) from test
    select number as [Num],
    ISNULL([Id],(select max(id) from test c where c.Num<a.number)) id 
    from master..spt_values a
    left join test b
    on a.number=b.Num
    where number between @min and @max and type='p'
    --你这个应该是比较简单的了,我看了执行计划
    select top 1 id from test where num<=5 order by Num desc/*
    Num id
    0 0
    1 1
    2 1
    3 2
    4 2
    5 2
    6 3
    7 3
    8 3
    9 4
    10 4
    11 4
    12 5
    13 5
    14 5
    15 6
    */
      

  4.   


    --这是我刚刚写的语句的执行的扫描和读取次数
    表 'test'。扫描计数 1,逻辑读取 1 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。表 'test'。扫描计数 2,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    表 'spt_values'。扫描计数 1,逻辑读取 2 次,物理读取 1 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。--这是你这个语句执行的的:
    表 'test'。扫描计数 1,逻辑读取 1 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。从效率上讲你这个语句是最简单了了