使用分析函数

--原始数据
select prd_type_id,
sum(amount)
from ALL_SALES
where year = 2003
and amount is not null
group by prd_type_id
order by prd_type_id;

--可以计算数据项在分组中的排名
select prd_type_id,
sum(amount),
row_number()over(order by sum(amount) desc) row_number,--无并列,根据sum(amount)倒序排名
rank()over(order by sum(amount) desc) rank, --并列不连续
dense_rank()over(order by sum(amount) desc) dense_rank --并列连续
from ALL_SALES
where year = 2003
and amount is not null
group by prd_type_id
order by prd_type_id;

--在递减排序中将空值指定为最高的排名,在递增排序指定为最低排名
select prd_type_id,
sum(amount),
row_number()over(order by sum(amount) desc) row_number,
rank()over(order by sum(amount) desc) rank,
dense_rank()over(order by sum(amount) desc) dense_rank
from ALL_SALES
where year = 2003
group by prd_type_id
order by prd_type_id;

--使用nulls last将空值指定为最低
select prd_type_id,
sum(amount),
row_number()over(order by sum(amount) desc nulls last) row_number,
rank()over(order by sum(amount) desc nulls last) rank,
dense_rank()over(order by sum(amount) desc nulls last) dense_rank
from ALL_SALES
where year = 2003
group by prd_type_id
order by prd_type_id;

--分析函数结合partition by字句
select prd_type_id,
month,
sum(amount),
rank()over(partition by month order by sum(amount) desc) rank --并列不连续,根据month分组之后sum(amount)倒序排名
from ALL_SALES
where year = 2003
and amount is not null
group by prd_type_id, month
order by prd_type_id, month;

--rollup
select prd_type_id,
sum(amount),
rank()over(order by sum(amount) desc) rank
from ALL_SALES
where year = 2003
group by rollup(prd_type_id)
order by prd_type_id;

--cube
select prd_type_id,emp_id,
sum(amount),
rank()over(order by sum(amount) desc) rank
from ALL_SALES
where year = 2003
group by cube(prd_type_id,emp_id)
order by prd_type_id,emp_id;

--grouping sets
select prd_type_id,emp_id,
sum(amount),
rank()over(order by sum(amount) desc) rank
from ALL_SALES
where year = 2003
group by grouping sets(prd_type_id,emp_id)
order by prd_type_id,emp_id;

--cume_dist
--percent_rank
select prd_type_id,
sum(amount),
cume_dist()over(order by sum(amount) desc) cume_dist,
percent_rank()over(order by sum(amount) desc) percent_rank
from ALL_SALES
where year = 2003
group by prd_type_id
order by prd_type_id;

时间: 2024-11-10 14:29:00

使用分析函数的相关文章

Oracle分析函数

1. ASCII 返回与指定的字符对应的十进制数; SQL> select ascii(A) A,ascii(a) a,ascii(0) zero,ascii( ) space from dual; A A ZERO SPACE --------- --------- --------- --------- 65 97 48 32 2. CHR 给出整数,返回对应的字符; SQL> select chr(54740) zhao,chr(65) chr65 from dual; ZH C --

学习Oracle分析函数(Analytic Functions)

Oracle提供了一些功能很强大的分析函数,使用这些函数可以完成可能需要存储过程来实现的需求. 分析函数计算基于一组数据行的聚合值,它们不同于聚合函数的是,它们为每一组返回多行结果.分析函数是除ORDER BY子句之外,在查询语句中最后执行的.所有的join和所有的WHERE ,GROUP BY 和HAVING子句都在分析函数之前执行.所以分析函数只能出现在select或ORDER BY子句中. 下图为11.2版本官方文档中给出的语法示意图: 下面简单介绍一下各个部分: analytic_fun

Oracle分析函数参考手册

Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行, 而聚合函数对于每个组只返回一行. 常用的分析函数如下所列: row_number() over(partition by ... order by ...) rank() over(partition by ... order by ...) dense_rank() over(partition by ... order by ...) count() over(part

oracle分析函数(2)

常用分析函数: 1. first,last --假设a := min(奖金) keep(dense_rank first order by 工资) --假设工资最少为1000,a为在工资等于1000的员工取最小的奖金 --假设b := min(奖金) keep(dense_rank last order by 工资) --假设工资最多为9999,b为在工资等于9999的员工取最小的奖金 --作为聚合函数 select e.department_id, min(e.hire_date) keep(

一、Oracle分析函数入门

分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计值. 分析函数和聚合函数的不同之处是什么?普通的聚合函数用group by分组,每个分组返回一个统计值,而分析函数采用partition by分组,并且每组每行都可以返回一个统计值. 分析函数的形式分析函数带有一个开窗函数over(),包含三个分析子句:分组(partition by), 排序(order by), 窗口(row

oracle 分析函数总结--仅供参考

/*  目录: 1.语法 2.常见函数及用法   2.1 排序函数   2.2 wm_concat()能实现不同行同字段的合并 !!!!生产环境慎用   2.3 开窗用法    2.4 占比函数ratio_to_report( ) over(partition by  )   2.5 前一个lag 后一个 lead   2.6 第一个first_value 最后一个last_value   2.7 加1连乘再减1    */      --1.分析函数的语法 :函数名() over (分区 排序

ORACLE分析函数(1)

1. oracle中日期转换为yyyy年mm月dd日的形式 select to_char(sysdate,'"年"mm"月"dd"日"') from dual; 2. oracle分析函数语法 2.1 ORDER BY select e.last_name, e.manager_id, e.salary, avg(e.salary) over() as emp_count --等同于(select avg(*) from employees) f

分析函数

在OLAP这类系统或者DW这类数据库中,作为某份报表的数据源,我们常常需要在某个存储过程中编写复杂的运算代码来汇总数据.分析函数便具备这样的能力,引用多行的数据值来进行多层面的聚合运算,在数据子集中进行颗粒度级别的排序控制.   分析函数不能嵌套,但是可以通过用视图或者表函数封装然后再套上一层分析函数 语法: function(argument1,argument2,argument3...) over ([partition by] [order by] [windowing-clause])

分析函数— —统计

很多需求中都涉及到统计:均值.累计.范围均值.相邻记录比较等.这些操作会统计多次,或有明确的统计范围,或返回的记录统计的数据集不同... 根据场景不同可分为如下几类:       1. 全统计    2. 滚动统计    3. 范围统计    4. (相邻)行比较 构建测试数据:SQL> desc criss_sales;Name       Type        Nullable Default Comments ---------- ----------- -------- -------

学习Oracle分析函数

Oracle提供了一些功能很强大的分析函数,使用这些函数可以完成可能需要存储过程来实现的需求. 分析函数计算基于一组数据行的聚合值,它们不同于聚合函数的是,它们为每一组返回多行结果.分析函数是除ORDER BY子句之外,在查询语句中最后执行的.所有的join和所有的WHERE ,GROUP BY 和HAVING子句都在分析函数之前执行.所以分析函数只能出现在select或ORDER BY子句中. 绍一下各个部分: analytic_function 指定分析函数的名字,后面列出了所有的分析函数