`
VincentZheng
  • 浏览: 52280 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

【转】Oracle分析函数简述

 
阅读更多
基本上所有的分析函数均是这种格式:

函数名称 ([参数]) OVER (analytic_clause)
analytic_clause包含:[partition 子句][ order 子句 [window子句]]

● Partition 子句:Partition by exp1[ ,exp2]...
Partition没啥说的,功能强大参数少,主要用于分组,可以理解成select中的group by。不过它跟select语句后跟的group by 子句并不冲突。

● Order子句:Order by exp1[asc|desc] [ ,exp2 [asc|desc]]... [nulls first|last]。部分函数支持window子句。
Order by的参数基本与select中的order by相同。大家按那个理解就是了。Nulls first|last是用来限定nulls在分组序列中的所在位置的,我们知道oracle中对于null的定义是未知,所以默认ordery的时候nulls总会被排在最前面。如果想控制值为null的列的话呢,nulls first|last参数就能派上用场了。

● Window子句:En,贴个图吧


看起来复杂其实简单,而且应用的机率相当的低,不详细介绍了。


● AVG( [ DISTINCT | ALL] expr) OVER(analytic_clause) 计算平均值。
例如:

--聚合函数
SELECT col, AVG(value) FROM tmp1 GROUP BY col ORDER BY col;
--分析函数
SELECT col, AVG(value) OVER(PARTITION BY col ORDER BY col)
  FROM tmp1
 ORDER BY col;


● SUM ( [ DISTINCT | ALL ] expr ) OVER ( analytic_clause )
例如:见上例。

● COUNT({* | [DISTINCT | ALL] expr}) OVER (analytic_clause) 查询分组序列中各组行数。
例如:

--分组查询col的数量
SELECT col,count(0) over(partition by col order by col) ct FROM tmp1;


● FIRST() 从DENSE_RANK返回的集合中取出排在第一的行。

例如:
--聚合函数
SELECT col,
	   MIN(value) KEEP(DENSE_RANK FIRST ORDER BY col) "Min Value",
	   MAX(value) KEEP(DENSE_RANK LAST ORDER BY col) "Max Value"
  FROM tmp1
 GROUP BY col;
--分析函数
SELECT col,
	   MIN(value) KEEP(DENSE_RANK FIRST ORDER BY col) OVER(PARTITION BY col),
	   MAX(value) KEEP(DENSE_RANK LAST ORDER BY col) OVER(PARTITION BY col)
  FROM tmp1
 ORDER BY col;

可以看到二者结果基本相似,但是ex1的结果是group by后的列,而ex2则是每一行都有返回。

● LAST()与上同,不详述。
例如:见上例。

● FIRST_VALUE (col) OVER ( analytic_clause ) 返回over()条件查询出的第一条记录
例如:

insert into tmp1 values ('test6','287');
SELECT col,
	   FIRST_VALUE(value) over(partition by col order by value) "First",
	   LAST_VALUE(value) over(partition by col order by value) "Last"
  FROM tmp1;


● LAST_VALUE (col) OVER ( analytic_clause ) 返回over()条件查询出的最后一条记录
例如:见上例。

● LAG(col[,n][,n]) over([partition_clause] order_by_clause) lag是一个相当有意思的函数,其功能是返回指定列col前n1行的值(如果前n1行已经超出比照范围,则返回n2,如不指定n2则默认返回null),如不指定n1,其默认值为1。
例如:

SELECT col,
	   value,
	   LAG(value) over(order by value) "Lag",
	   LEAD(value) over(order by value) "Lead"
  FROM tmp1;


● LEAD(col[,n][,n]) over([partition_clause] order_by_clause) 与上函数正好相反,本函数返回指定列col后n1行的值。
例如:见上例

● MAX (col) OVER (analytic_clause) 获取分组序列中的最大值。
例如:

--聚合函数
SELECT col,
	   Max(value) "Max",
	   Min(value) "Min"
  FROM tmp1
 GROUP BY col;
--分析函数
SELECT col,
	   value,
	   Max(value) over(partition by col order by value) "Max",
	   Min(value) over(partition by col order by value) "Min"
  FROM tmp1;

 
● MIN (col) OVER (analytic_clause) 获取分组序列中的最小值。
例如:见上例。

● RANK() OVER([partition_clause] order_by_clause) 关于RANK和DENSE_RANK前面聚合函数处介绍过了,这里不废话不,大概直接看示例吧。
例如:

insert into tmp1 values ('test2',120);
SELECT col,
	   value,
	   RANK() OVER(order by value) "RANK",
	   DENSE_RANK() OVER(order by value) "DENSE_RANK",
	   ROW_NUMBER() OVER(order by value) "ROW_NUMBER"
  FROM tmp1;


● DENSE_RANK () OVER([partition_clause] order_by_clause)
例如:见上例。

● ROW_NUMBER () OVER([partition_clause] order_by_clause) 这个函数需要多说两句,通过上述的对比相信大家应该已经能够看出些端倪。前面讲过,dense_rank在做排序时如果遇到列有重复值,则重复值所在行的序列值相同,而其后的序列值依旧递增,rank则是重复值所在行的序列值相同,但其后的序列值从+重复行数开始递增,而row_number则不管是否有重复行,(分组内)序列值始终递增
例如:见上例。

● CUME_DIST() OVER([partition_clause] order_by_clause) 返回该行在分组序列中的相对位置,返回值介于0到1之间。注意哟,如果order by的列是desc,则该分组内最大的行返回列值1,如果order by为asc,则该分组内最小的行返回列值1。
例如:
SELECT col, value, CUME_DIST() OVER(ORDER BY value DESC) FROM tmp1;


● NTILE(n) OVER([partition_clause] order_by_clause) 
ntile是个很有意思的统计函数。它会按照你指定的组数(n)对记录做分组
例如:
SELECT t.*,ntile(5) over(order by value desc) FROM tmp1 t;


● PERCENT_RANK() OVER([partition_clause] order_by_clause) 与CUME_DIST类似,本函数返回分组序列中各行在分组序列的相对位置。其返回值也是介于0到1之间,不过其起始值始终为0而终结值始终为1。
例如:
SELECT col, value, PERCENT_RANK() OVER(ORDER BY value) FROM tmp1;


● PERCENTILE_CONT(n) WITHIN GROUP (ORDER BY col [DESC|ASC]) OVER(partition_clause)
本函数功能与前面聚合函数处介绍的完全相同,只是一个是聚合函数,一个是分析函数。
例如:

--聚合函数
SELECT col, max(value), min(value), sum(value),
	   PERCENTILE_CONT(0.5) WITHIN GROUP(ORDER BY value) a,
	   PERCENTILE_CONT(0.8) WITHIN GROUP(ORDER BY value) b
  FROM TMP1
 group by col;
--分析函数
SELECT col,
	   value,
	   sum(value) over(partition by col) "Sum",
	   PERCENTILE_CONT(0.5) WITHIN GROUP( ORDER BY value) OVER(PARTITION BY col) "CONTa",
	   PERCENTILE_CONT(0.8) WITHIN GROUP( ORDER BY value) OVER(PARTITION BY col) "CONTb"
  FROM TMP1;


● PERCENTILE_DISC(n) WITHIN GROUP (ORDER BY col [DESC|ASC]) OVER(partition_clause)
本函数功能与前面聚合函数处介绍的完全相同,只是一个是聚合函数,一个是分析函数。
例如:

--聚合函数
SELECT col, max(value), min(value), sum(value),
	   PERCENTILE_DISC(0.5) WITHIN GROUP(ORDER BY value) a,
	   PERCENTILE_DISC(0.8) WITHIN GROUP(ORDER BY value) b
  FROM TMP1
 group by col;
--分析函数
SELECT col,
	   value,
	   sum(value) over(partition by col) "Sum",
	   PERCENTILE_DISC(0.5) WITHIN GROUP( ORDER BY value) OVER(PARTITION BY col) "CONTa",
	   PERCENTILE_DISC(0.8) WITHIN GROUP( ORDER BY value) OVER(PARTITION BY col) "CONTb"
  FROM TMP1;


● RATIO_TO_REPORT(col) over ([partition_clause]) 本函数计算本行col列值在该分组序列sum(col)中所占比率。如果col列为空,则返回空值。
例如:

SELECT col, value,
	   RATIO_TO_REPORT(value) OVER(PARTITION BY col) "RATIO_TO_REPORT"
  FROM TMP1


● STDDEV ([distinct|all] col) OVER (analytic_clause) 返回列的标准偏差。
例如:

--聚合函数
SELECT col, STDDEV(value) FROM TMP1 GROUP BY col;
--分析函数
SELECT col, value,
	   STDDEV(value) OVER(PARTITION BY col ORDER BY value) "STDDEV"
  FROM TMP1;


● STDDEV_SAMP(col) OVER (analytic_clause) 功能与上相同,与STDDEV不同地方在于如果该分组序列只有一行的话,则STDDEV_SAMP函数返回空值,而STDDEV则返回0。
例如:

--聚合函数
SELECT col, STDDEV(value),STDDEV_SAMP(value) FROM TMP1 GROUP BY col;
--分析函数
SELECT col, value,
	   STDDEV(value) OVER(PARTITION BY col ORDER BY value) "STDDEV",
	   STDDEV_SAMP(value) OVER(PARTITION BY col ORDER BY value) "STDDEV_SAMP"
  FROM TMP1;


● STDDEV_POP(col) OVER (analytic_clause) 返回该分组序列总体标准偏差
例如:

--聚合函数
SELECT col, STDDEV_POP(value) FROM TMP1 GROUP BY col;
--分析函数
SELECT col, value,
	   STDDEV_POP(value) OVER(PARTITION BY col ORDER BY value) "STDDEV_POP"
  FROM TMP1;


● VAR_POP(col) OVER (analytic_clause) 返回分组序列的总体方差,VAR_POP进行如下计算:(SUM(expr2) - SUM(expr)2 / COUNT(expr)) / COUNT(expr)
例如:

--聚合函数
SELECT col, VAR_POP(value) FROM TMP1 GROUP BY col;
--分析函数
SELECT col, value,
	   VAR_POP(value) OVER(PARTITION BY col ORDER BY value) "VAR_POP"
  FROM TMP1;


● VAR_SAMP(col) OVER (analytic_clause) 与上类似,该函数返回分组序列的样本方差,,其计算公式为:(SUM(expr2) - SUM(expr)2 / COUNT(expr)) / (COUNT(expr) - 1)
例如:

--聚合函数
SELECT col, VAR_SAMP(value) FROM TMP1 GROUP BY col;
--分析函数
SELECT col, value,
	   VAR_SAMP(value) OVER(PARTITION BY col ORDER BY value) "VAR_SAMP"
  FROM TMP1;


● VARIANCE(col) OVER (analytic_clause) 该函数返回分组序列方差,Oracle计算该变量如下:
如果表达式中行数为1,则返回0,如果表达式中行数大于1,则返回VAR_SAMP
例如:

--聚合函数
SELECT col, VAR_SAMP(value),VARIANCE(value) FROM TMP1 GROUP BY col;
--分析函数
SELECT col, value,
	   VAR_SAMP(value) OVER(PARTITION BY col ORDER BY value) "VAR_SAMP",
	   VARIANCE(value) OVER(PARTITION BY col ORDER BY value) "VARIANCE"
  FROM TMP1;
  • 大小: 8.4 KB
  • 大小: 8.9 KB
分享到:
评论

相关推荐

    oracle函数介绍(5) 分析函数简述.doc

    第五篇 分析函数简述 分析函数的语法结构比较复杂,但多数函数都具有相同的语法结构,所以先在之前进行统一介绍,后续单个函数介绍时就不过多说明函数语法结构了。  基本上所有的分析函数均是这种格式:  函数...

    ORACLE 常用分析函数

    分析函数简述  ROW_NUMBER () OVER([partition_clause] order_by_clause) dense_rank在做排序时如果遇到列有重复值,则重复值所在行的序列值相同,而其后的序列值依旧递增,rank则是重复值所在行的序列值相同,但...

    ORACLE函数介绍 全系列中文

    oracle函数介绍 5 分析函数简述 pdf oracle函数介绍 6 著名函数之分析函数 pdf oracle函数介绍 7 非著名函数之分析函数 pdf oracle函数介绍 8 综述 pdf">oracle函数介绍 1 著名函数之单值函数 pdf oracle函数...

    oracle 分析函数详解(有例子)

    8 分析函数简述">1 Oracle开发专题之:分析函数 OVER 2 Oracle开发专题之:分析函数 Rank Dense rank row number 3 Oracle开发专题之:分析函数3 Top Bottom N First Last NTile 4 Oracle开发专题之:窗口函数 5...

    oracle分析函数全面解析

    分析函数简述** 分析函数的强大之处在于其灵活性和可扩展性。通过巧妙地使用分析函数,开发者可以实现许多高级的数据分析任务,比如计算移动平均、计算累积和、识别数据模式等。 **7. 分析函数目录** 分析函数的...

    oracle分析函数指南

    7. **分析函数简述** Oracle提供了26个内置的分析函数,包括`AVG()`, `COUNT()`, `MAX()`, `MIN()`, `SUM()`, `LEAD()`, `LAG()`, `RANK()`, `DENSE_RANK()`, `ROW_NUMBER()`等,每个都有其独特的用途和用法,熟练...

    Oracle分析函数.doc

    7. **分析函数简述**: - 提供了对分析函数的基本介绍,包括其用途和优点。 通过熟练掌握Oracle分析函数,数据库管理员和开发人员能够更高效地处理大数据,进行复杂的查询和分析,尤其是在OLAP环境中,能够显著...

    oracle分析函数

    9. **分析函数简述** 分析函数的简述涵盖了基本概念和用法,是初学者入门的良好起点。随着经验的积累,开发者会逐渐发现分析函数在解决实际问题时的强大能力。 通过深入理解和实践,Oracle分析函数可以成为数据...

    深入浅出oracle分析函数(全)

    8. **分析函数简述**: 对分析函数的全面理解和应用涉及到对SQL查询的深入理解,包括如何定义窗口、如何处理数据流以及如何利用这些函数来解决实际业务问题。 综上所述,Oracle分析函数是数据库查询中的强大工具,...

    oracle函数大全(分类成9个word文档)

    4. "oracle函数介绍(5) 分析函数简述.doc":分析函数,如RANK()、ROW_NUMBER()和LEAD/LAG(),在处理分组数据时非常有用,可以提供行级别的排序和计算。 5. "oracle函数介绍(6) 著名函数之分析函数.doc"和"oracle...

    oracle函数

    分析函数在`oracle函数介绍(6) 著名函数之分析函数.doc`、`oracle函数介绍(7) 非著名函数之分析函数.doc`和`oracle函数介绍(5) 分析函数简述.doc`中详述,它们可以对整个结果集执行计算,而不仅仅是单行或分组。...

    SQL分析函数进阶

    8. 分析函数简述: 分析函数的简述提供了基础概念和使用示例,对于初学者来说是很好的学习资源。通过阅读和实践,可以逐步掌握这些功能强大的工具。 在OLAP系统中,分析函数扮演着至关重要的角色,因为它们能高效...

    Oracle聚組與分析函數之使用

    8. **分析函数简述**: - 除了上述介绍的功能外,Oracle 还提供了更多分析函数,如 `LAG()`, `LEAD()`, `MIN()`, `MAX()`, `SUM()`, `AVG()` 等在窗口上的版本,它们在分析过程中提供了极大的便利。 通过熟练掌握...

    oracle资料

    "oracle函数介绍(5) 分析函数简述.doc"介绍了分析函数,这是Oracle的一个强大特性,如`LAG`, `LEAD`, `FIRST_VALUE`, `LAST_VALUE`和`NTILE`等,它们允许在结果集上进行窗口化计算,为复杂的数据分析提供便利。...

    Oracle试卷及答案

    临时段**:临时段用于存储临时数据,例如排序操作或聚合函数的结果。 - **C. 回滚段**:回滚段用于保存事务处理的回滚信息,确保事务的原子性和一致性。 - **D. 代码段**:Oracle数据库并没有直接使用“代码段”...

    李新华老师Oracle高清教程

    11. **数据库架构**:简述Oracle的物理和逻辑架构,包括数据文件、控制文件、重做日志文件等组件的作用。 通过李新华老师的高清教程,你将能够逐步掌握这些Oracle数据库的核心概念和操作技能。视屏教程的形式将使得...

    oracle入门 基础教程 pdf 文档

    - 系统需求:分析安装Oracle数据库所需的硬件和软件环境,包括操作系统兼容性、内存与磁盘空间要求等。 - 安装流程:详细步骤解析,从下载安装文件到配置数据库实例,包括响应文件的使用、选择安装类型(如Express...

    oracle学习手册 很详细的讲解 非扫描完整书签版1431页

    14. **Oracle 云服务**:简述Oracle云数据库服务,如Oracle Autonomous Database的特性、优势和使用场景。 这本手册通过1431页的丰富内容,为学习Oracle数据库提供了一个全面而深入的指南,无论是初学者还是经验...

Global site tag (gtag.js) - Google Analytics