sql语句--分析函数

  1. 常见的分析函数包括:
评级函数:可计算等级、排名、百分点、 n 分片(三分片、四分片等)。
窗口函数:计算一定的记录范围内或者一定时间内的和、平均值、最大值、最小值等。
分析函数的语法如下:
analytic_function([ arguments ]) over(analytic_clause)
其中:
1) analytic_function :分析函数的名称。
2) arguments :分析函数所带参数,内置分析函数一般带 0-3 个参数。参数可以是任何数字
类型或是可以隐式转换为数字类型的数据类型。 Oracle 根据最高数字优先级别确定函数参数,
并且隐式地将需要处理的参数转换为数字类型。
3) over :用以标识函数是一个分析函数,对于既可作为聚集函数又可作为分析函数的函数,必
须用 over 来标识此函数为分析函数。 over 关键字是必须的,是分析函数就必须使用。 over
后面小括号中是 analytic_clause, 即使 analytic_clause 的三个部分都不使用,小括号
也不能省略,否则 oracle 因不能识别函数为分析函数而报错。
4) analytic_clause 的语法如下:
[query_partition_clause] [order_by_clause [ windowing_clause]]
query_partition_clause 是查询分组子句;
order_by_clause 是分组排序子句;
windowing_clause 是窗口范围子句。
  1. 常见的评级函数
  • 根据不同的排名方式:
SELECT t.*, RANK() OVER(ORDER BY salary DESC) rk
FROM hr.employees t;
SELECT t.*, DENSE_RANK() OVER(ORDER BY salary DESC) drk
FROM hr.employees t;
  • 为每一条记录返回一个数字(需要在数据中增加序列时,可使用 row_number()函数。)
SELECT t.*, ROW_NUMBER() OVER(ORDER BY salary DESC) rn
FROM employees t;
  • 数据中有 id 相同的两条记录时,进行去重
CREATE TABLE hr.emp_test
AS SELECT * FROM employees WHERE employee_id=105;
INSERT INTO hr.emp_test VALUES
('105','Jack','Zhang','AHUNOLD','515.131.4369',
to_date('2015-9-30','yyyy-mm-dd'),
'FI_MGR',4200.00,null,100,50);
SELECT * FROM
( SELECT t.*, ROW_NUMBER() OVER(PARTITION BY employee_id
ORDER BY hire_date) rn
FROM hr.emp_test t)
WHERE rn = 1;

说明: 表中有两位员工的员工号均为 105,后入职的员工工号分配错误,按照员工工号进行分 组,并按入职时间进行排序,选出排序为 1 的记录,就是员工号正确的员工信息。 row_number() over 函数的一种常见用法是当数据中有 id 相同的两条记录时,可按照时 间等字段进行排序,然后继续记录筛选,从而完成去重操作。

2.窗口函数

窗口可以结合这 些函数使用:SUM()AVG()MAX()MIN()COUNT()等。窗口也可以和 FIRST_VALUE 和 LAST_VALUE 结合使用,用来返回窗口中的第一个值和最后一个值。

SELECT t.*,
SUM(salary) OVER(PARTITION BY department_id) sum_sal_dept,
AVG(salary) OVER(PARTITION BY department_id) avg_sal_dept
SUM(salary) OVER(PARTITION BY 1) sum_sal
FROM hr.employees t;
说明:当需要不同类型的计算值,以及不同维度的计算值,并要求使用一条语句实现时,就
可以在语句中使用窗口函数,不同窗口中的分组排序互不影响。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值