Analytic Functions 分析函数(rank over)

此篇文章是为了学会rank() over()所写。
官方文档

(DENSE_)RANK( ) OVER ([ query_partition_clause ] order_by_clause)
rank():跳跃式,两个第1,下一个就是第3
dense_rank():非跳跃式,两个第1,下一个是第2

基础

analytic_function

analytic_function([ arguments ]) OVER (analytic_clause)

analytic_clause

[ query_partition_clause ] [ order_by_clause [ windowing_clause ] ]

Use OVER analytic_clause to indicate that the function operates on a
query result set. This clause is computed after the FROM, WHERE, GROUP
BY, and HAVING clauses. You can specify analytic functions with this
clause in the select list or ORDER BY clause. To filter the results of
a query based on an analytic function, nest these functions within the
parent query, and then filter the results of the nested subquery.
使用OVER analytic_clause表示该函数对查询结果集进行操作。 该子句是在FROM,WHERE,GROUP BY和HAVING子句之后计算的。 您可以在选择列表或ORDER BY子句中使用此子句指定分析函数。 要基于分析函数过滤查询结果,请将这些函数嵌套在父查询中,然后过滤嵌套子查询的结果。

query_partition_clause

PARTITION BY
  {
    
     expr[, expr ]...
  | ( expr[, expr ]... )
  }

Use the PARTITION BY clause to partition the query result set into groups based on one or more value_expr. If you omit this clause, then the function treats all rows of the query result set as a single group.
使用PARTITION BY子句可将查询结果集基于一个或多个value_expr分组。 如果省略此子句,则该函数会将查询结果集的所有行都视为一个组。

order_by_clause

ORDER [ SIBLINGS ] BY
{
    
     expr | position | c_alias }
[ ASC | DESC ]
[ NULLS FIRST | NULLS LAST ]
  [, {
    
     expr | position | c_alias }
     [ ASC | DESC ]
     [ NULLS FIRST | NULLS LAST ]
  ]...

windowing_clause

Some analytic functions allow the windowing_clause

{
    
     ROWS | RANGE }
{
    
     BETWEEN
  {
    
     UNBOUNDED PRECEDING
  | CURRENT ROW
  | value_expr {
    
     PRECEDING | FOLLOWING }
  } 
  AND
  {
    
     UNBOUNDED FOLLOWING
  | CURRENT ROW
  | value_expr {
    
     PRECEDING | FOLLOWING }
  }
| {
    
     UNBOUNDED PRECEDING
  | CURRENT ROW
  | value_expr PRECEDING
  }
}

应用

用到的表结构如下.成绩表
在这里插入图片描述

1.对选修C13课程的学生,按分数跳跃式排名(可以并列),显示名次与学号,按名次、学号升序排列。

select 学号,rank() over( order by 分数 desc nulls last)名次,分数 
from a_db.成绩 
where 课程号='C13'
order by 名次,学号;

在这里插入图片描述

2.查询每门课程考试成绩第一名(可以并列)的学生的学号与课程号,按课程号升序排列。

select 课程号,学号,分数
from(select 学号,分数,课程号,rank() over(partition by 课程号 order by 分数 desc nulls last )名次 from a_db.成绩)
where 名次=1
order by 课程号;

在这里插入图片描述

3.按平均分数对课程连续排名(可以并列),显示名次、课程号与平均分数(保留2位小数),按名次、课程号升序排列。

select 名次,课程号,round(平均分数,2) 平均分
from (select 课程号,dense_rank() over(order by avg(分数) desc)名次,avg(分数) 平均分数 from a_db.成绩 group by 课程号)
order by 名次,课程号;

在这里插入图片描述

4.查询每门课程的课程号,以及每门课程考试成绩第一名(可以并列)的学生的姓名,按课程号与姓名升序排列。

select 课程号,姓名
from (select 课程号,姓名,rank() over(partition by 课程号 order by 分数 desc nulls last) 排名 from a_db.成绩 natural join a_db.学生)
where 排名=1
order by 课程号,姓名;

在这里插入图片描述


CREATE TABLE 成绩 
(
  学号 VARCHAR2(4 BYTE) NOT NULL,
 课程号 VARCHAR2(5 BYTE) NOT NULL ,
分数 NUMBER(3, 0) ,
绩点 NUMBER(3, 1) 
);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S101','C01',65,18);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S102','C01',83,39.6);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S103','C01',69,24);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S104','C01',81,39.6);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S105','C01',79,36);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S106','C01',68,24);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S107','C01',77,32.4);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S108','C01',76,32.4);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S109','C01',76,32.4);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S201','C01',91,48);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S202','C01',95,48);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S203','C01',83,39.6);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S204','C01',77,32.4);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S205','C01',77,32.4);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S206','C01',92,48);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S207','C01',92,48);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S208','C01',72,27.6);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S209','C01',69,24);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S301','C01',66,18);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S302','C01',58,0);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S303','C01',45,0);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S304','C01',83,39.6);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S305','C01',65,18);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S306','C01',76,32.4);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S307','C01',57,0);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S308','C01',77,32.4);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S309','C01',68,24);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S310','C01',86,44.4);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S311','C01',84,39.6);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S101','C02',81,9);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S102','C02',82,9.9);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S103','C02',83,9.9);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S104','C02',82,9.9);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S105','C02',76,8.1);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S106','C02',75,8.1);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S107','C02',61,3);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S108','C02',74,6.9);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S109','C02',76,8.1);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S201','C02',92,12);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S202','C02',72,6.9);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S203','C02',69,6);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S204','C02',37,0);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S205','C02',62,3);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S206','C02',44,0);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S207','C02',55,0);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S208','C02',66,4.5);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S209','C02',69,6);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S301','C02',76,8.1);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S302','C02',76,8.1);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S303','C02',79,9);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S304','C02',72,6.9);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S305','C02',81,9);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S306','C02',82,9.9);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S307','C02',83,9.9);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S308','C02',79,9);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S309','C02',68,6);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S310','C02',86,11.1);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S311','C02',84,9.9);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S101','C03',84,16.5);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S102','C03',73,11.5);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S103','C03',56,0);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S104','C03',91,20);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S105','C03',95,20);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S106','C03',81,15);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S107','C03',73,11.5);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S108','C03',84,16.5);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S109','C03',66,7.5);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S201','C03',83,16.5);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S202','C03',71,10);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S203','C03',81,15);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S204','C03',68,10);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S205','C03',92,20);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S206','C03',83,16.5);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S207','C03',65,7.5);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S208','C03',37,0);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S209','C03',62,5);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S301','C03',76,13.5);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S302','C03',76,13.5);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S303','C03',79,15);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S304','C03',72,11.5);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S305','C03',81,15);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S306','C03',8,0);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S307','C03',45,0);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S308','C03',79,15);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S309','C03',68,10);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S310','C03',86,18.5);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S311','C03',84,16.5);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S101','C13',74,9.2);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S102','C13',63,4);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S104','C13',81,12);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S105','C13',85,14.8);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S107','C13',63,4);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S108','C13',74,9.2);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S202','C13',63,4);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S203','C13',73,9.2);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S205','C13',84,13.2);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S206','C13',null,null);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S207','C13',60,4);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S209','C13',57,0);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S301','C13',78,12);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S302','C13',78,12);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S304','C13',74,9.2);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S305','C13',83,13.2);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S307','C13',87,14.8);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S308','C13',81,12);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S310','C13',88,14.8);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S311','C13',86,14.8);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S101','C14',33,0);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S103','C14',66,6);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S104','C14',61,4);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S106','C14',81,12);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S107','C14',85,14.8);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S109','C14',65,6);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S201','C14',60,4);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S202','C14',42,0);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S204','C14',52,0);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S205','C14',63,4);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S207','C14',null,null);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S208','C14',70,8);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S303','C14',72,9.2);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S304','C14',81,12);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S306','C14',80,12);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S307','C14',51,0);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S101','C24',88,12);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S102','C24',68,6);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S103','C24',72,6.9);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S101','C25',65,4.5);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S102','C25',38,0);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S103','C25',61,3);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S104','C25',90,12);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S105','C25',54,0);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S106','C25',null,null);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S107','C25',86,11.1);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S108','C25',60,3);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S109','C25',78,9);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S103','C13',46,0);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S106','C13',71,8);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S109','C13',56,0);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S201','C13',56,0);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S204','C13',60,4);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S208','C13',32,0);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S303','C13',81,12);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S306','C13',10,0);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S309','C13',70,8);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S102','C14',93,16);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S105','C14',63,4);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S108','C14',80,12);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S203','C14',61,4);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S206','C14',61,4);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S209','C14',93,16);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S305','C14',60,4);
Insert into A_DB."成绩" ("学号","课程号","分数","绩点") values ('S308','C14',60,4);

猜你喜欢

转载自blog.csdn.net/qq_43179428/article/details/108857381