Oracle row_number() over()解析函数高效实现分页

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle row_number() over()解析函数高效实现分页相关的知识,希望对你有一定的参考价值。

参考技术A 复制代码
代码如下:
create
table
T_NEWS
(
ID
NUMBER,
N_TYPE
VARCHAR2(20),
N_TITLE
VARCHAR2(30),
N_COUNT
NUMBER
)
prompt
Disabling
triggers
for
T_NEWS...
alter
table
T_NEWS
disable
all
triggers;
prompt
Loading
T_NEWS...
insert
into
T_NEWS
(ID,
N_TYPE,
N_TITLE,
N_COUNT)
values
(1,
'IT',
'爱it1',
100);
insert
into
T_NEWS
(ID,
N_TYPE,
N_TITLE,
N_COUNT)
values
(2,
'体育',
'爱体育1',
10);
insert
into
T_NEWS
(ID,
N_TYPE,
N_TITLE,
N_COUNT)
values
(3,
'体育',
'爱体育2',
30);
insert
into
T_NEWS
(ID,
N_TYPE,
N_TITLE,
N_COUNT)
values
(4,
'IT',
'爱it2',
300);
insert
into
T_NEWS
(ID,
N_TYPE,
N_TITLE,
N_COUNT)
values
(5,
'IT',
'爱it3',
200);
insert
into
T_NEWS
(ID,
N_TYPE,
N_TITLE,
N_COUNT)
values
(6,
'体育',
'爱体育3',
20);
insert
into
T_NEWS
(ID,
N_TYPE,
N_TITLE,
N_COUNT)
values
(7,
'体育',
'爱体育4',
60);
commit;
第一步:我先用rownum
--分页
row_number,不是rownum
--根据n_count从大到小排列,每页3条
SELECT
ROWNUM
r,t.*
FROM
t_news
t
WHERE
ROWNUM<=3
ORDER
BY
t.n_count
DESC
--问题:为什么order
by以后,行号是乱的?
SELECT
ROWNUM
r,t.*
FROM
t_news
t
--原因:先分配了行号,再根据n_count排序
--所以必须排序,再生成行号
SELECT
ROWNUM
r,t.*
FROM
(
SELECT
t.*
FROM
t_news
t
ORDER
BY
t.n_count
DESC
)
t
--分页
--err
SELECT
ROWNUM
r,t.*
FROM
(
SELECT
t.*
FROM
t_news
t
ORDER
BY
t.n_count
DESC
)
t
WHERE
r
between
1
AND
3
--第1页
SELECT
ROWNUM
r,t.*
FROM
(
SELECT
t.*
FROM
t_news
t
ORDER
BY
t.n_count
DESC
)
t
WHERE
ROWNUM
between
1
AND
3
--第2页
SELECT
ROWNUM
r,t.*
FROM
(
SELECT
t.*
FROM
t_news
t
ORDER
BY
t.n_count
DESC
)
t
WHERE
ROWNUM
between
4
AND
6
--error:
ROWNUM必须从1开始!
SELECT
k.*
FROM
(
SELECT
ROWNUM
r,t.*
FROM
(
SELECT
t.*
FROM
t_news
t
ORDER
BY
t.n_count
DESC
)
t
)
k
WHERE
r
BETWEEN
4
AND
6
--麻烦,效率低!
*****第二步:我用row_number()
over()函数
select
t2.*
from
(select
t.*,row_number()over(order
by
t.n_count
desc)
orderNumber
from
t_news
t
order
by
t.n_count
desc)t2
where
orderNumber
between
1and
3;
*****************************************************************************************************************************************88
SELECT
*
FROM
(
SELECT
t.*,row_number()
over(ORDER
BY
n_count
DESC)
r
FROM
t_news
t
ORDER
BY
t.n_count
DESC
)
t
WHERE
r
BETWEEN
4
AND
6
--通用语法:
解析函数()
over(partition
by
字段
order
by
字段)

关于Oracle row_number() over()的简单使用

 

简单介绍:在Oracle中使用row_number() over()函数,对查询的结果进行分组,并支持分组后的排序功能,这是我使用之后的简单理解。

场景1:在面试过程中经常遇到的一个问题,把一个班中每一科成绩最高的人查找出来。

思路:查询出一个班所有科目的成绩,使用row_number() over()按照科目分组并按成绩降序排列。

表数据如图所示:

 

sql语句:

SELECT T.NAME,T.SUBJECT,T.SCORE  ,row_number()OVER(PARTITION BY T.SUBJECT ORDER BY T.SCORE DESC) SEQ FROM JAVA_SCORE T;排序结果:

 

场景2:删除成绩表中科目重复的数据,仅保留分数最高的一条。

思路:row_number()OVER(PARTITION  By 字段1,字段2 ORDER BY 排序字段)中的PARTITION  By作用于分组函数group一致,但是row_number()OVER()的执行是在where 、group by、  order by 之后执行的。也就是对结果一个分组排序。

SQL:

DELETE FROM JAVA_SCORE where id in(                       --执行删除操作
  SELECT ID FROM (
         SELECT T.ID, T.NAME,T.SUBJECT,T.SCORE  ,row_number()OVER(PARTITION BY T.SUBJECT ORDER BY T.SCORE DESC) SEQ FROM JAVA_SCORE T --按照科目分组,并根据分数排序
  ) T WHERE T.SEQ > 1 --筛选不是第一名的数据
)

以上是关于Oracle row_number() over()解析函数高效实现分页的主要内容,如果未能解决你的问题,请参考以下文章

关于Oracle row_number() over()的简单使用

ORACLE 中的 ROW_NUMBER() OVER() 分析函数的用法

ORACLE 中的 ROW_NUMBER() OVER() 分析函数的用法

ORACLE 中的 ROW_NUMBER() OVER() 分析函数的用法

Oracle中排序函数的用法之ROW_NUMBER()_RANK()_DENSE_RANK() OVER()的区别

Oracle 分析函数 ROW_NUMBER() 使用