zoukankan      html  css  js  c++  java
  • 分页查询总结

    今天帮一同学解决了一个比较奇葩的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

    两种效果都一样。

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

    两种比较

    .....

  • 相关阅读:
    Web开发学习之路--Eclipse+Tomcat+mysql之初体验
    Android必知必会-Stetho调试工具
    Android开发学习之路--NDK、JNI之初体验
    OpenMP基础----以图像处理中的问题为例
    leetcode 2 Add Two Numbers
    Java在linux下调用C/C++生成的so文件
    OpenCV特征点检测匹配图像-----添加包围盒
    [POJ 1442] Black Box
    [POJ 2019] Cornfields
    [HDU 1806] Frequent values
  • 原文地址:https://www.cnblogs.com/vinplezhang/p/3523066.html
Copyright © 2011-2022 走看看