ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Oracle row_number() over( order by )的经典案例

2021-02-07 23:32:19  阅读:264  来源: 互联网

标签:01 OrderInfo rowIndex over number 订单 Oracle select


Oracle row_number() over( order by )的经典案例

  1. 使用row_number()函数对订单进行编号,按照订单时间倒序。(此需求多用于分页)

  2. 所有订单按照客户进行分组,并按照客户下的订单的金额倒序排列。

  3. 筛选出客户第一次下的订单。

  4. 筛选出客户在‘2011年1月1日之后的第一次下的订单。

  5. 只保留每个客户的最近的一次订单,其余的订单删掉。(常用于删除重复数据)

  6. 统计每一个客户所有的订单中金额最大,并统计该订单是客户第几次购买; 参考 https://www.cnblogs.com/willingtolove/p/10623841.html#_label1 下方为 完整的代码实例 (纯手敲)

 -- 参考 https://www.cnblogs.com/willingtolove/p/10623841.html#_label1
 create table OrderInfo(
        Id int PRIMARY KEY   NOT NULL,
        UserId varchar(50) NOT NULL,
        TotalPrice float NOT NULL,
        OrderTime date NOT NULL
 );
 ​
 select sysdate from dual;
 select * from OrderInfo;
 INSERT INTO OrderInfo
            (id,UserId
            ,TotalPrice
            ,OrderTime)
      VALUES
            (1,'1', 111, to_date('2011-01-01 15:33:44','yyyy-mm-dd hh24:mi:ss'));
 INSERT INTO OrderInfo
            (id,UserId
            ,TotalPrice
            ,OrderTime)
      VALUES (2,'1', 112, to_date('2011-01-02 15:33:44','yyyy-mm-dd hh24:mi:ss'));
 INSERT INTO OrderInfo
            (id,UserId
            ,TotalPrice
            ,OrderTime)
      VALUES
            (3,'3', 311, to_date('2013-01-01 15:33:44','yyyy-mm-dd hh24:mi:ss'));
 INSERT INTO OrderInfo
            (id,UserId
            ,TotalPrice
            ,OrderTime)
      VALUES
            (4,'3', 312, to_date('2013-01-02 15:33:44','yyyy-mm-dd hh24:mi:ss'));
 INSERT INTO OrderInfo
            (id,UserId
            ,TotalPrice
            ,OrderTime)
      VALUES
            (5,'2', 211, to_date('2012-01-01 15:33:44','yyyy-mm-dd hh24:mi:ss'));
 INSERT INTO OrderInfo
            (id,UserId
            ,TotalPrice
            ,OrderTime)
      VALUES
            (6,'2', 212,to_date('2012-01-02 15:33:44','yyyy-mm-dd hh24:mi:ss'));
 INSERT INTO OrderInfo
            (id,UserId
            ,TotalPrice
            ,OrderTime)
      VALUES
            (7,'1', 113, to_date('2011-01-03 15:33:44','yyyy-mm-dd hh24:mi:ss'));
 INSERT INTO OrderInfo
            (id,UserId
            ,TotalPrice
            ,OrderTime)
      VALUES
            (8,'2', 213, to_date('2012-01-03 15:33:44','yyyy-mm-dd hh24:mi:ss'));
 INSERT INTO OrderInfo
            (id,UserId
            ,TotalPrice
            ,OrderTime)
      VALUES
            (9,'3', 313,to_date('2013-01-03 15:33:44','yyyy-mm-dd hh24:mi:ss'));
 ​
 -- 1.使用row_number()函数对订单进行编号,按照订单时间倒序。(此需求多用于分页)
 select O.*,row_number() over(order by O.ORDERTIME desc) as rowIndex from OrderInfo O;
 -- 分页场景:每页三条数据 取第二页
 with
 baseDate
 as
 (
 -- 按要求进行编号
    select Id,UserId,TotalPrice,OrderTime,ROW_NUMBER() over (order by OrderTime desc) as rowIndex from OrderInfo
 )
 select * from baseDate where rowIndex>3 and rowIndex<7;
 ​
 -- 2. 所有订单按照客户进行分组,并按照客户下的订单的金额倒序排列。
 select O.*,row_number() over(partition by O.UserId order by O.TOTALPRICE desc)as rowIndex from OrderInfo O;
 ​
 -- 3. 筛选出客户第一次下的订单。
 with
 baseDate
 as
 (
 select O.* ,row_number() over(partition by O.USERID order by O.ORDERTIME )as rowIndex from OrderInfo O
 )
 select * from baseDate where rowIndex=1;
 ​
 -- 4. 筛选出客户在‘2011年1月1日之后的第一次下的订单。
 -- 注意:在使用over等开窗函数时,over里头的分组及排序的执行晚于“where,group by,order by”的执行。
 with
 baseDate
 as
 (
 select O.*,row_number() over(partition by O.USERID order by O.ORDERTIME)as rowIndex from OrderInfo O
 where O.ORDERTIME> to_date('2011-01-01 15:33:44','yyyy-mm-dd hh24:mi:ss')
 )
 select * from baseDate where rowIndex = 1;
 ​
 -- 5. 只保留每个客户的最近的一次订单,其余的订单删掉。(常用于删除重复数据)
 -- <> == !=
 with
 baseDate
 as
 (
 select O.*,row_number() over(partition by O.USERID order by O.ORDERTIME desc) from OrderInfo O
 )
 delete from baseDate where rowIndex<>1;
 ​
 -- 6. 统计每一个客户所有的订单中金额最大,并统计该订单是客户第几次购买;
 with
 baseDate
 as
 (
 select O.*,row_number() over(partition by O.USERID order by O.ORDERTIME )rowIndex from OrderInfo O
 ),
 basePrice
 as
 (
 select O.*,row_number() over(partition by O.USERID order by O.TOTALPRICE desc) rowIndex from OrderInfo O
 )
 select * from baseDate where Id in( select Id from basePrice where rowIndex=1);
 ​
 -- 删除表
 drop table OrderInfo;

 

标签:01,OrderInfo,rowIndex,over,number,订单,Oracle,select
来源: https://www.cnblogs.com/yk2763691852/p/14387156.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有