Oracle高级函数:分组排序rank() over (partition by)或row_number() over(partition by)

开发者导航网站:https://codernav.com

row_number() over(partition by)

语法格式:

row_number() over(partition by 分组列 order by 排序列 desc)

功能:

分组后排序,在使用 row_number() over()函数时候,over()里头的分组以及排序的执行晚于 where 、group by、 order by 的执行。

-- 单纯排序,无分组

select id,name,class,score,row_number() over(order by score desc) ranking from student_scores t

-- 先分组,再排序

select id,name,class,score,row_number() over(partition by class order by score desc) ranking from student_scores t

-- 先分组,再排序,取第一名

select * from (select id,name,class,score,row_number() over(partition by class order by score desc) ranking from student_scores t) where ranking < 2

rank() over (partition by)

作用:分组排序

准备数据:

-- 创建表
CREATE TABLE student_scores ( id INT PRIMARY KEY, name VARCHAR ( 50 ), class VARCHAR ( 10 ), score INT );
-- 插入测试数据
INSERT INTO student_scores (id, name, class, score) VALUES (1, 'Alice', 'A', 85);
INSERT INTO student_scores (id, name, class, score) VALUES (2, 'Bob', 'A', 90);
INSERT INTO student_scores (id, name, class, score) VALUES (3, 'Charlie', 'B', 95);
INSERT INTO student_scores (id, name, class, score) VALUES (4, 'David', 'B', 80);
INSERT INTO student_scores (id, name, class, score) VALUES (5, 'Emma', 'A', 75);
INSERT INTO student_scores (id, name, class, score) VALUES (6, 'Frank', 'B', 85);

要求:

计算每个班级中学生的成绩排名

SELECT
    id,
    name,
    class,
    score,
    RANK ( ) OVER ( PARTITION BY class ORDER BY score DESC ) AS ranking 
FROM
    student_scores;

执行结果:

Oracle高级函数:分组排序rank() over (partition by)或row_number() over(partition by)_第1张图片

说明:

在这个查询中,我们使用了partition by class来将数据按照班级进行分区,然后按照成绩降序排列。最后,我们将计算得到的排名作为ranking列返回。

更多精彩内容:https://codernav.com

你可能感兴趣的:(oracle,数据库)