数据排序后,怎么样获取第一条,下一条,上一条,最末一条的记录?

starry11 2005-07-05 05:18:01
比如一个表有ID,name两个字段

假如我希望获取根据name降序排序后的第一条,某条记录的下一条,某条记录的上一条和最末一条记录的ID怎么办呢?要求是按照name排序后的顺序抽取哦

请高手指点,谢谢
...全文
701 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
yinleiyoung 2006-05-09
  • 打赏
  • 举报
回复
关注
lilylamb 2005-07-11
  • 打赏
  • 举报
回复
很不错的解决
starry11 2005-07-11
  • 打赏
  • 举报
回复
我的确就是这样解决的,但是我希望能够找到个方法,根本不需要去改升序或是降序啊

不过,谢谢 duanzilin(寻) anyway

我不明白为什么last_value不起作用 :(
starry11 2005-07-07
  • 打赏
  • 举报
回复
改了排序条件当然可以了 :(

我希望的是不需要再去修改排序条件
kerisyml 2005-07-07
  • 打赏
  • 举报
回复
duanzilin(寻) 的解答真very Good!
沝林 2005-07-07
  • 打赏
  • 举报
回复
排序条件没改啊,降序最后1个不就是升序第1个,结果没错就可以了啊,有时候灵活一点可以就解决问题的
starry11 2005-07-06
  • 打赏
  • 举报
回复
再试了一下,first_value,lag,lead都可以用

但是last_id得不到最后那个id,返回的还是第一个id
我这样写不知道行不行?
select last_id from
(select t.*,last_value(id) over(order by name desc) last_id from t)
starry11 2005-07-06
  • 打赏
  • 举报
回复
用楼上的方法,报告说“丢失的此函数窗口说明”
沝林 2005-07-06
  • 打赏
  • 举报
回复
SQL> select * from tbname1 order by name desc
2 /

NAME ID
-------------------- ----------
rqj 4
oqq 7
gew 2
fekj 6
agre 3
ADFD 1
5er 5
1r4 8

已选择8行。

SQL> select * from
2 (select t.*,first_value(id) over(order by name desc) first_id,
3 first_value(id) over(order by name) last_id,
4 lag(id) over(order by name desc) pre_id,
5 lead(id) over(order by name desc) next_id
6 from tbname1 t)
7 where id = 2
8 /

NAME ID FIRST_ID LAST_ID PRE_ID NEXT_ID
-------------------- ---------- ---------- ---------- ---------- ----------
gew 2 4 8 7 6
沝林 2005-07-06
  • 打赏
  • 举报
回复
SQL> select * from tbname1 order by name desc
2 /

NAME ID
-------------------- ----------
rqj 4
oqq 7
gew 2
fekj 6
agre 3
ADFD 1
5er 5
1r4 8

已选择8行。

SQL> @d:\test.sql
8 /

NAME ID FIRST_ID LAST_ID PRE_ID NEXT_ID
-------------------- ---------- ---------- ---------- ---------- ----------
gew 2 4 8 7 6
沝林 2005-07-06
  • 打赏
  • 举报
回复
把last_value(id) over(order by name desc) last_id换成
first_value(id) over(order by name) last_id试试
沝林 2005-07-05
  • 打赏
  • 举报
回复
改一下
select * from
(select t.*,first_value(id) over(order by name desc) first_id,last_value(id) over(order by name desc) last_id,lag(id) over(order by name desc) pre_id,lead(id) over(order by name desc) next_id from 表 t)
where id = 2
沝林 2005-07-05
  • 打赏
  • 举报
回复
下面语句查出id为2的纪录的前一条和后1条id以及name最大和最小对应的id
select * from
(select t.*,first_value(id) over(order by name desc) first_id,last_value(id) over(order by name desc) last_id,lag(id) over(order by name desc) pre_id,lag(id,-1) over(order by name desc) next_id from 表 t)
where id = 2
bzszp 2005-07-05
  • 打赏
  • 举报
回复
用游标
或者在前台处理
如:recordset对象

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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