【SQL】order by 分页排序

遇到项目,需要按照结束时间从最近的开始排序,首先思路就是先排序,再分页,分页是按照每页10行,也就是第一页查询行号1-10的数据来实现;

1.先查询数据并排序

        select row_number() over(order by ROWNUM) as rn,
               to_char(bp.startdate, 'yyyy-mm-dd HH:mi:ss') "startdate",
               to_char(bp.enddate, 'yyyy-mm-dd HH:mi:ss') "enddate"
          from T_Client_Policy cp
          left join T_Bus_Policy bp
            on cp.policyno = bp.policyno
           and cp.riskcode = bp.riskcode
         where cp.clientno = '200054382009' order by enddate desc

查询后排序正常

2.输出行号为1-10的数据

select *
  from (select row_number() over(order by ROWNUM) as rn,
               to_char(bp.startdate, 'yyyy-mm-dd HH:mi:ss') "startdate",
               to_char(bp.enddate, 'yyyy-mm-dd HH:mi:ss') "enddate"
          from T_Client_Policy cp
          left join T_Bus_Policy bp
            on cp.policyno = bp.policyno
           and cp.riskcode = bp.riskcode
         where cp.clientno = '200054382009' order by enddate desc)
 where rn between 1 and 10

发现数据并的结束日期并没有按照2019年为最开始往下排序

查看原因,发现结束日期并不是我们想象中的2019排在最前边,仔细看看,是定义的行号不对,

原因:SQL在进行查询的时候,先查询后排序,所以,我们需要在外边加一层已经排序好的sql,对最外层进行行号取1-10行为一进行分页

正确:

select *
  from (select row_number() over(order by ROWNUM) as rn, startdate, enddate
          from (select to_char(bp.startdate, 'yyyy-mm-dd HH:mi:ss') startdate,
                       to_char(bp.enddate, 'yyyy-mm-dd HH:mi:ss') enddate
                  from T_Client_Policy cp
                  left join T_Bus_Policy bp
                    on cp.policyno = bp.policyno
                   and cp.riskcode = bp.riskcode
                 where cp.clientno = '200054382009'
                 order by enddate desc))
 where rn between 1 and 10

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值