没有合适的资源?快使用搜索试试~ 我知道了~
首页oracle select top的方法
Oracle SQL语法不支持select top 100 * from table_a之类的top语法,当然可以使用rownum取出多少行来看,但是如果加上排序还使用这个rownum的话,大部分情况是,先取出rownum行记录,然后排序再显示,这和我们要求的排序后再取rownum行是不同的,不符合要求。而且更进一步说,假设我要查看每个分组的前N个记录呢?又如何实现?
资源详情
资源评论
资源推荐

28 从前 N 行到每个分组的前 N 行
28.1
Oracle SQL 语法不支持 select top 100 * from table_a 之类的 top 语法,当然可以使
用 rownum 取出多少行来看,但是如果加上排序还使用这个 rownum 的话,大部
分情况是,先取出 rownum 行记录,然后排序再显示,这和我们要求的排序后再
取 rownum 行是不同的,不符合要求。而且更进一步说,假设我要查看每个分组
的前 N 个记录呢?又如何实现?
28.2
情景:EBS 11i 中有个表 FND_LOGINS,记载的是登陆系统的信息,记载了谁(列
名 user_id),什么时候(列名 start_time)登陆系统情况,还有个自增列(login_id)
记载登陆系统的顺序,这个值越大当然是越晚登陆,现在有两个要求:
1. 查询出最近 100 次登陆信息
如果使用 select * from FND_LOGINS where rownum<101 order by login_id desc
这个语法查出来的不是想要的结果,它是先取 100 条记录,然后再排序给你看。
稍微变通下,有两种方法,以自增列值更大为更晚登陆系统,因为以这列判断比
用时间判断更快更准确些(有的登陆系统时间到秒都相同,如果光以时间来判断
那是无法知道哪个先哪个后的)。
select * from (select * from FND_LOGINS order by login_id desc) where
rownum<101
或者
select * from
(
select a.*,row_number() over (order by login_id desc) as rn from FND_LOGINS a
)
where rn<101
2. 查询出每个用户的最近 10 次登陆信息
select * from
(
select a.*,row_number() over (PARTITION BY user_id order by login_id desc) as
rn from FND_LOGINS a
) b
where rn<11
row_number 的用法请参考文档 Oracle 9i SQL Reference Release 2(9.2),Part No.
A96540-02 第 349 页

















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0