求 一存储进程的写法

levitate 2012-05-11 04:32:30
一个表 A , 有列 lv sc1 sc2 , 都是 int 字段

现在按变量n 输出前n条 (按lv排序), 且 每行与上下行之间的 sc1 之差不小于100, sc2 之差不小于200
...全文
63 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Esengnet 2012-05-11
  • 打赏
  • 举报
回复
try this:

create procedure sp_test
( @n int
)
as
begin
declare @id int, @lv int, @sec1 int , @sc1 int, @count int, @row int
declare @pre_id int, @pre_lv int, @pre_sec1 int , @pre_sc1 int

create table #temp(id int identity,lv int, sec1 int, sc1 int)
create table #return(lv int, sec1 int, sc1 int)

insert into #temp(lv , sec1 , sc1 )
select lv, sec1, sc1
from a
order by lv, sec1, sc1



declare cur_1 cursor for
select id, lv, sec1, sc1
from #temp

open cur_1
fetch cur_1 into @id, @lv, @sec1, @sc1

set @count=1
set @row=1

while (@@sqlstatus != 2 )
begin
if @row=1
begin
set @pre_id=@id
set @pre_lv=@lv
set @pre_sec1=@sec1
set @pre_sc1=@sc1
set @row =2
fetch cur_1 into @id, @lv, @sec1, @sc1
end
else
begin
if (@sec1 - @pre_sec1) > 100 and (@sc1 - @pre_sc1) > 200
begin

if @count <=@n
begin
insert into #return(lv, sec1,sc1) values(@lv,@sec1,@sc1)

set @count = @count+1
set @pre_id=@id
set @pre_lv=@lv
set @pre_sec1=@sec1
set @pre_sc1=@sc1
end
end

fetch cur_1 into @id, @lv, @sec1, @sc1
end
end
close cur_1
deallocate cur_1

select * from #return

drop table #temp
drop table #return

end
levitate 2012-05-11
  • 打赏
  • 举报
回复
比如 从这个表里 读取 10 条记录 , 那么 这 10条记录 必须是 lv 排序的到的, 但是 必须要满足 比如 第一条记录的sc1 和第二条记录的sc1 之间的差值必须大于100 sc2 的差值必须大于 200
  • 打赏
  • 举报
回复
举例说明
昵称被占用了 2012-05-11
  • 打赏
  • 举报
回复
举例说明

22,210

社区成员

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

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