开窗函数有哪些?
开窗函数有:矩形窗函数、三角窗函数、巴特利特窗函数、广义余弦窗、汉宁窗函数、海明窗函数、布莱克曼窗函数、凯塞窗函数和切比雪夫窗函数
开窗函数也叫分析函数,有两类:一类是聚合开窗函数,一类是排序开窗函数。开窗函数与聚合函数计算方式一样,开窗函数也是对行集组进行聚合计算,但是它不像普通聚合函数那样每组只返回一个值,开窗函数可以为每组返回多个值。
延伸阅读
sum是开窗函数吗?
通常情况下,sum是指求和函数
什么是分析函数?
分析函数是什么?
分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计值。
分析函数的形式
分析函数带有一个开窗函数over(),包含三个分析子句:分组(partition by), 排序(order by), 窗口(rows) ,他们的使用形式如下:over(partition by xxx order by yyy rows between zzz)。
sql语句的几个常用函数总结?
聚合函数max() count() sum() min()开窗函数row_number(),rank()时间函数convert(),adatediff(week,[dateadd],getdate())
ratio函数的用法?
ratio用法主要是迎来创建有关的数据表:Syntax
分析函数RATIO_TO_REPORT 用来计算当前记录的指标expr占开窗函数over中包含记录的所有同一指标的百分比. 这里如果开窗函数的统计结果为null或者为0,就是说占用比率的被除数为0或者为null, 则得到的结果也为0.
开窗条件query_partition_clause决定被除数的值, 如果用户忽略了这个条件, 则计算查询结果中所有记录的汇总值.
用户不能使用其他分析函数或者ratio_to_report作为分析函数ratio_to_report的参数expr, 也就是说这个函数不能循环使用. 但我们可以使用其他普通函数作为这个分析函数的查询结果.
Examples 1
下面的示例演示了如何计算每一个员工的工资占部门全部工资的比例.
创建表
create table T_salary(
F_depart varchar2(20),
F_EMP varchar2(20),
F_salary integer
);
truncate table t_salary;
— 插入测试数据
insert into t_salary(f_depart, f_emp, f_salary)
select ‘信息管理部’,’张三’,10000 from dual
union all
select ‘信息管理部’,’李四’,2000 from dual
union all
select ‘人力资源部’,’王五’,3000 from dual
union all
select ‘人力资源部’,’赵六’,10000 from dual;
commit;
–查询每个员工占所在部门的工资比例
select f_depart,f_emp,f_salary,sum(f_salary) over(partition by f_depart) sum_salary,
ratio_to_report(f_salary) over(partition by f_depart) ratio_salary
from t_salary;
–递归查询员工占所在部门的百分比, 以及部门所占公司的工资比例.
select f_depart,f_emp,f_salary,g1,
sum(f_salary) over(partition by decode(g1, 0, f_depart, null), g1) sum_salary,
ratio_to_report(f_salary) over(partition by decode(g1, 0, f_depart, null), g1) r_salary
from (
select f_depart,
f_emp,
sum(f_salary) f_salary, grouping(f_depart) + grouping(F_emp) g1
from t_salary
group by rollup(f_depart, f_emp)
) t
由于分析函数可以使用普通函数的结果作为expr参数, 所以上面的代码又可以整合为下述方式.
select f_depart,
f_emp,
sum(f_salary) f_salary,
sum(sum(f_salary)) over(partition by decode(grouping(f_depart) + grouping(F_emp), 0, f_depart, null),grouping(f_depart) + grouping(F_emp)) sum_salary,
ratio_to_report(sum(f_salary)) over(partition by decode(grouping(f_depart) + grouping(F_emp), 0, f_depart, null),grouping(f_depart) + grouping(F_emp)) r_salary,
grouping(f_depart) + grouping(F_emp) g1
from t_salary
group by rollup(f_depart, f_emp)。
开窗函数原理?
在开窗函数出现之前存在着很多用 SQL 语句很难解决的问题,很多都要通过复杂的相关子查询或者存储过程来完成。
为了解决这些问题,在2003年ISO SQL标准加入了开窗函数,开窗函数的使用使得这些经典的难题可以被轻松的解决
什么时候使用开窗函数?
开窗函数常结合聚合函数使用,一般来讲聚合后的行数要少于聚合前的行数,但是有时我们既想显示聚集前的数据,
又要显示聚集后的数据,这时我们便引入了窗口函数.
主要作用将会聚合函数的结果分配到查询结果的每一行当中去
示例:
select Name , ID, COUNT(*) OVER() from UserInfo
将会聚合函数的结果分配到查询结果的每一行当中去。
taredta 开窗函数怎么用?
开窗函数(OVER子句)用于为行定义一个窗口(这里的窗口是指运算将要操作的行的集合),它对一组值进行操作,不需要使用GROUP BY子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列。
举例来说,如果要得到一个年级所有班级所有学生的平均分,按照传统的写法,肯定是通过АVG聚合函数来实现求平均分。由于聚合函数是以GROUP BY 查询作为操作的上下文对一组值进行聚合,GROUP BY 操作对数据进行分组后,查询为每个组只返回一行数据,因此,我们不能同时返回基础列(班级,学生等列),而只能得到聚合列。