Oracle分析函数与开窗函数 order by partition by

1. 创建数据表partition_by_test
SQL> CREATE TABLE partition_by_test (NAME VARCHAR(20) NOT NULL, PAR NUMBER);
SQL> INSERT INTO partition_by_test VALUES (‘CAR’,10000);
SQL> INSERT INTO partition_by_test VALUES (‘CAR’,20000);
SQL> INSERT INTO partition_by_test VALUES (‘CAR’,30000);
SQL> INSERT INTO partition_by_test VALUES (‘VAN’,40000);
SQL> INSERT INTO partition_by_test VALUES (‘VAN’,30000);
SQL> INSERT INTO partition_by_test VALUES (‘VAN’,10000);
SQL> INSERT INTO partition_by_test VALUES (‘VAN’,50000);
SQL> INSERT INTO partition_by_test VALUES (‘BUS’,90000);
SQL> INSERT INTO partition_by_test VALUES (‘BUS’,20000);
SQL> INSERT INTO partition_by_test VALUES (‘BUS’,40000);
SQL> INSERT INTO partition_by_test VALUES (‘BUS’,60000);
SQL> COMMIT;
SQL> SELECT * FROM partition_by_test;

NAME PAR
CAR 10000
CAR 10000
CAR 30000
VAN 40000
VAN 30000
VAN 10000
VAN 50000
BUS 90000
BUS 20000
BUS 40000
BUS 60000

2. 分析函数over
SQL> SELECT NAME,ROW_NUMBER() OVER( PARTITION BY NAME ORDER BY PAR DESC) RAK, PAR FROM partition_by_test;

NAME RAK PAR
BUS 1 90000
BUS 2 60000
BUS 3 40000
BUS 4 20000
CAR 1 30000
CAR 2 10000
CAR 3 10000
VAN 1 50000
VAN 2 40000
VAN 3 30000
VAN 4 10000

SQL> SELECT NAME,RANK() OVER( PARTITION BY NAME ORDER BY PAR DESC) RAK, PAR FROM partition_by_test;

NAME RAK PAR
BUS 1 90000
BUS 2 60000
BUS 3 40000
BUS 4 20000
CAR 1 30000
CAR 2 10000
CAR 2 10000
VAN 1 50000
VAN 2 40000
VAN 3 30000
VAN 4 10000

SQL> SELECT NAME,SUM(PAR) OVER( PARTITION BY NAME ORDER BY PAR DESC) RAK, PAR FROM partition_by_test;

NAME RAK PAR
BUS 90000 90000
BUS 150000 60000
BUS 190000 40000
BUS 210000 20000
CAR 30000 30000
CAR 50000 10000
CAR 50000 10000
VAN 50000 50000
VAN 90000 40000
VAN 120000 30000
VAN 130000 10000

3. 开窗函数order by

  1. over()开窗函数
    在使用聚合函数后,会将多行变成一行,而开窗函数是将一行变成多行;并且在使用聚合函数后,如果要显示其他的列必须将列加入到group by中,而使用开窗函数后,可以不使用group by,直接将所有信息显示出来。
  2. 常用开窗函数
    为每条数据显示聚合信息.(聚合函数() over())
    为每条数据提供分组的聚合函数结果(聚合函数() over(partition by 字段) as 别名) --按照字段分组,分组后进行计算
    与排名函数一起使用(row number() over(order by 字段) as 别名)

第一行是 unbounded preceding,
当前行是 current row,
最后一行是 unbounded following
当开窗函数over()出现分组(partition by)子句时,unbounded preceding即第一行是指表中一个分组里的第一行, unbounded following即最后一行是指表中一个分组里的最后一行;当开窗函数over()省略了分组(partition by)子句时, unbounded preceding即第一行是指表中的第一行, unbounded following即最后一行是指表中的最后一行。

你可能感兴趣的:(Oracle分析函数与开窗函数 order by partition by)