首页 > 其他 > 详细

分页查询总结

时间:2014-01-17 09:02:09      阅读:369      评论:0      收藏:0      [点我收藏+]

今天帮一同学解决了一个比较奇葩的sql问题。

数据

日期      成绩
201201      5
201202      3
201203      1
201204      4
201205      5

要求:从某一个年月往前推,合格数据(成绩大于3)的连续条数,只要发现有一条不符合条件,就停止下来,当前的连续记录数就是要求的结果,不管前面是否还有连续的记录条数。

思路:

1.可以先找出不符合条件的记录集当中年月最大的一条,只需要对其按年月进行降序。

2.从这条记录当中取出的年月,然后作为找出符合条件的记录的条件,符合条件的记录必须大于这个年月,找出的记录数就是结果。

select count(1) from t where to_date(‘201306‘, ‘yyyymm‘)>to_date((select 日期
                          from t
                         where 成绩 < 3
                           and rownum = 1
                         order by 日期 desc));

 

优化过程:其实.......

 优化之后如下

select months_between(to_date (select 日期
                          from t
                         where 成绩 < 3
                           and rownum = 1
                         order by 日期 desc, ‘yyyymm‘),
                       to_date(‘201306‘, ‘yyyymm‘));

 

 

对于关键字rownum的理解

 rownum可以理解为对每条记录的一个标号

 select * from lccont where rownum between 1 and 4 and conttype=‘2‘

 select * from (select rownum rn,t.* from lccont t) m where m.conttype=‘2‘ and m.rn between 1 and 4

两种效果都一样。

但第二种多了一列行号,可以区分出没有主键时,具有相同字段值的不同记录。

 

两种比较

.....

分页查询总结

原文:http://www.cnblogs.com/vinplezhang/p/3523066.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!