1.高级排序函数:
[ROW_NUMBER()| RANK() | DENSE_RANK ] OVER (partition by xx order by xx) 在使用时会产生行号。
1.1 row_number() 连续且递增的数字 1 2 3 4
row_number() over (partition by xx order by xx )
1.2 rank() 跳跃排序 若有相同数据则排名相同 然后跳跃排序 1 2 2 2 5
rank() over (partition by xx order by xx )
1.3 dense_rank 若有相同数据则排名相同 然后递增排序
dense_rank over (partition by xx order by xx ) 1 2 2 2 3
1.4 partition by 与 group by 的比较
(1) partition by 用于对结果集进行分区,将原始数据进行排列,记录数不变
(2) group by 是对原始数据进行聚合统计,记录可能变少,每一组数据返回一条
2.高级分组函数
2.1 group by rollup(a,b,c)
对rollup后面的列 按从右到左以少一列的方式进行分组直到所有列都去掉后的分组(也就是全表分组),
对于n个参数的 rollup,有n+1次分组,即按a,b,c,分组,union all a,b分组 union all a分组。
案例:select a,b,c,sum(d) from test group by rollup(a,b,c)
2.2 group by cube(a,b,c) 对n个参数,有2^n次分组,即按 ab,ac,a,bc,b,c最后对 全部分组
2.3 group by grouping sets(a,b) 即只列出 对 a分组后,和对 b分组的结果集
3.开窗函数 和 分析函数
3.1 说明:
开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化,
开窗函数不能单独使用,必须分分析函数一起使用。
3.2 常见的分析函数
rank(),dense_rank(),row_number()等
3.3 常见的开窗函数
over()等
3.4 开窗函数的调用格式为: 函数名(列) OVER(选项)
(1)OVER keyword表示把函数当成开窗函数而不是聚合函数。
(2)SQL 标准同意将全部聚合函数用做开窗函数,使用OVER keyword来区分这两种使用方法。
(3)OVER keyword后的括号里还常常加入选项用以改变进行聚合运算的窗口范围,
假设OVER keyword后的括号里的选项为空,则开窗函数会对结果集中的全部行进。
案例1: select p.fcity, p.fname,count(*)over() from t_person p where p.fsalary < 5000;
开窗函数COUNT(*)OVER()对于查询结果的每一行都返回全部符合条件的行的条数。
案例2: over(partition by deptno)
按照部门分区
案例3: sum(s)over(order by s range between 2 preceding and 2 following)
表示加2或2的范围内的求和
案例4: sum(s)over(order by s rows between 2 preceding and 2 following)
表示在上下两行之间的范围内
案例5:row_number(partition by ## order by ## ) rn 分区排序
4.常用的函数功能与作用
函数主要分为两大类:单行函数 组函数;
SQL和PL/SQL中自带很多类型的函数,有字符、数字、日期、转换、和混合型等多种函数用于处理单行数据,因此这些都可被统称为单行函数
(1)TO_CHAR(sysdate,'yyyy-MM-dd hh24:mi:ss'); 日期转换字符串
SELECT TO_CHAR(sysdate ,'yyyy-MM-dd hh24:mi:ss') FROM DUAL;
(2)TO_DATE('2018-10-24 18:30:59','yyyy-MM-dd hh24:mi:ss') 时间字符串转换日期
SELECT TO_DATE('2018-10-24 18:30:59','yyyy-MM-dd hh24:mi:ss') FROM DUAL;
(3)TO_NUMBER('123') 将字符串的字段转换成数字
SELECT TO_NUMBER('123') FROM DUAL;
(4)CONCAT('ABC','def') 字符串拼接
SELECT CONCAT('ABC','def') FROM DUAL;
(5)DECODE(value, if1, then1, if2,then2, if3,then3, . . . else ) 对value值进行转换
select decode('1','1','abc','def') from dual;
(6)NVL 从两个表达式返回一个非 null 值,若两个都为空则返回空,''oracle默认为null,与带空格 ' '不是一回事
select nvl('','124') from dual;
(7)REPLACE ( char, search_string [, replace_string])
select REPLACE('123','1','a') from dual;