简单区间判断(在线等,效率结贴!!!)

gwf25sz 2010-11-29 04:40:40
表格如下:

id kb
1 100
2 120
3 260
4 480
5 800

输入80 查出 id = 1 这条
输入130 查出 id = 2 这条
输入900 查出 id = 5 这条


请问怎么写SQL


...全文
69 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
fa_ge 2010-11-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 dawugui 的回复:]
引用 7 楼 fa_ge 的回复:
SQL code

CREATE TABLE #
(id INT, kb INT)
INSERT INTO #
SELECT 1, 100 UNION ALL
SELECT 2, 120 UNION ALL
SELECT 3, 260 UNION ALL
SELECT 4, 480 UNION ALL
SELECT 5, 800


D……
[/Quote]

呵呵谢谢老乌龟指点。的确是有这样的临界数据。
jiao3630 2010-11-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 dawugui 的回复:]
引用 7 楼 fa_ge 的回复:
SQL code

CREATE TABLE #
(id INT, kb INT)
INSERT INTO #
SELECT 1, 100 UNION ALL
SELECT 2, 120 UNION ALL
SELECT 3, 260 UNION ALL
SELECT 4, 480 UNION ALL
SELECT 5, 800


D……
[/Quote]

学习 考虑不周
dawugui 2010-11-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 fa_ge 的回复:]
SQL code

CREATE TABLE #
(id INT, kb INT)
INSERT INTO #
SELECT 1, 100 UNION ALL
SELECT 2, 120 UNION ALL
SELECT 3, 260 UNION ALL
SELECT 4, 480 UNION ALL
SELECT 5, 800


DECLARE @qty int
SE……
[/Quote]
你和五楼错到一起去了。
dawugui 2010-11-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jiao3630 的回复:]
SQL code

select top 1 * from tb
order by abs(kb-@num)
[/Quote]
你这个稍微有所欠缺,如果他输入110,其结果应该是第一,第二两条记录才对。
fa_ge 2010-11-29
  • 打赏
  • 举报
回复

CREATE TABLE #
(id INT, kb INT)
INSERT INTO #
SELECT 1, 100 UNION ALL
SELECT 2, 120 UNION ALL
SELECT 3, 260 UNION ALL
SELECT 4, 480 UNION ALL
SELECT 5, 800


DECLARE @qty int
SET @qty=80

SELECT * FROM #
WHERE id IN
(
SELECT TOP 1 ID FROM # ORDER BY abs(kb-@qty)
)

SET @qty=130
SELECT * FROM #
WHERE id IN
(
SELECT TOP 1 ID FROM # ORDER BY abs(kb-@qty)
)


SET @qty=900
SELECT * FROM #
WHERE id IN
(
SELECT TOP 1 ID FROM # ORDER BY abs(kb-@qty)
)

/*
id kb
----------- -----------
1 100

(1 行受影响)

id kb
----------- -----------
2 120

(1 行受影响)

id kb
----------- -----------
5 800

(1 行受影响)
*/
dawugui 2010-11-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 gwf25sz 的回复:]
谢谢各位高手,很管用
能否解释下语句
[/Quote]
语句很简单嘛.还需要解释?
--1、查询出两值kb-@kb,绝对值最小的值。
select min(abs(kb-@kb)) abs_kb from tb

--2、查询两值kb-@kb,绝对值等于上面的那个最小值。
select * from tb where abs(kb-@kb) = (select min(abs(kb-@kb)) abs_kb from tb)
jiao3630 2010-11-29
  • 打赏
  • 举报
回复

select top 1 * from tb
order by abs(kb-@num)
gwf25sz 2010-11-29
  • 打赏
  • 举报
回复
谢谢各位高手,很管用
能否解释下语句
tim_spac 2010-11-29
  • 打赏
  • 举报
回复
先定义一个区间配置表及区间匹配算法吧
dawugui 2010-11-29
  • 打赏
  • 举报
回复
create table tb(id int, kb int)
insert into tb values(1 ,100)
insert into tb values(2 ,120)
insert into tb values(3 ,260)
insert into tb values(4 ,480)
insert into tb values(5 ,800)
go

declare @kb as int

set @kb = 80
select * from tb where abs(kb-@kb) = (select min(abs(kb-@kb)) abs_kb from tb)
/*
id kb
----------- -----------
1 100

(所影响的行数为 1 行)
*/

set @kb = 130
select * from tb where abs(kb-@kb) = (select min(abs(kb-@kb)) abs_kb from tb)
/*
id kb
----------- -----------
2 120

(所影响的行数为 1 行)
*/

set @kb = 900
select * from tb where abs(kb-@kb) = (select min(abs(kb-@kb)) abs_kb from tb)
/*
id kb
----------- -----------
5 800

(所影响的行数为 1 行)
*/

drop table tb
dawugui 2010-11-29
  • 打赏
  • 举报
回复
select * from tb where abs(kb-@kb) =
(select min(abs(kb-@kb)) abs_kb from tb)

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧