问个SQL语句范围筛选的问题
表A
Id 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语句怎么写?谢谢
[解决办法]
直接用num跟你输入的数比较,条件为num小于等于你输入的数,然后取最大的ID
SELECT TOP 1 ID FROM tb WHERE num<=你输入的数 ORDER BY NUM DESC
[解决办法]
select top 1
from (
select Id ,Num from table1 where num<=@param
)
order by Num desc
没想到还有更好的方法了
[解决办法]
- SQL code
--> 测试数据:[test]if object_id('[test]') is not null drop table [test]create table [test]([Id] int,[Num] int)insert [test]select 0,0 union allselect 1,1 union allselect 2,3 union allselect 3,6 union allselect 4,9 union allselect 5,12 union allselect 6,15--这个方法也可以,不过没这个简单declare @min intdeclare @max intselect @min=Min(num),@max=Max(num) from testselect number as [Num],ISNULL([Id],(select max(id) from test c where c.Num<a.number)) id from master..spt_values aleft join test bon a.number=b.Numwhere number between @min and @max and type='p'--你这个应该是比较简单的了,我看了执行计划select top 1 id from test where num<=5 order by Num desc/*Num id0 01 12 13 24 25 26 37 38 39 410 411 412 513 514 515 6*/
[解决办法]
- SQL code
--这是我刚刚写的语句的执行的扫描和读取次数表 '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 次。从效率上讲你这个语句是最简单了了