Oracle row_number() over( order by )的经典案例
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Oracle row_number() over( order by )的经典案例,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4241字,纯文字阅读大概需要7分钟。
内容图文
Oracle row_number() over( order by )的经典案例
-
使用row_number()函数对订单进行编号,按照订单时间倒序。(此需求多用于分页)
-
所有订单按照客户进行分组,并按照客户下的订单的金额倒序排列。
-
筛选出客户第一次下的订单。
-
筛选出客户在‘2011年1月1日之后的第一次下的订单。
-
只保留每个客户的最近的一次订单,其余的订单删掉。(常用于删除重复数据)
-
统计每一个客户所有的订单中金额最大,并统计该订单是客户第几次购买; 参考 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;
内容总结
以上是互联网集市为您收集整理的Oracle row_number() over( order by )的经典案例全部内容,希望文章能够帮你解决Oracle row_number() over( order by )的经典案例所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。