Oracle中分析函数用法小结

合集下载

Oracle分析函数用法详解

Oracle分析函数用法详解

Oracle分析函数Oracle分析函数实际上操作对象是查询出的数据集,也就是说不需二次查询数据库,实际上就是oracle实现了一些我们自身需要编码实现的统计功能,对于简化开发工作量有很大的帮助,特别在开发第三方报表软件时是非常有帮助的。

Oracle从8.1.6开始提供分析函数。

一、基本语法oracle分析函数的语法:function_name(arg1,arg2,...)over(<partition-clause> <order-by-clause ><windowing clause>)说明:1.partition-clause 数据记录集分组2.order-by-clause 数据记录集排序3.windowing clause 功能非常强大、比较复杂,定义分析函数在操作行的集合。

有三种开窗方式: range、row、specifying。

二、常用分析函数1. avg(distinct|all expression) 计算组内平均值,distinct 可去除组内重复数据select deptno,empno,sal,avg(sal) over (partition by deptno) avg_sal from t;DEPTNO EMPNO SAL AVG_SAL---------- ---------- ---------- ----------10 7782 2450 2916.666677839 5000 2916.666677934 1300 2916.6666720 7566 2975 21757902 3000 21757876 1100 21757369 800 21757788 3000 217530 7521 1250 1566.666677844 1500 1566.666677499 1600 1566.666677900 950 1566.666677698 2850 1566.666677654 1250 1566.666672.count(<distinct><*><expression>) 对组内数据进行计数3.rank() 和dense_rank()dense_rank()根据 order by 子句表达式的值,从查询返回的每一行,计算和其他行的相对位置,序号从 1 开始,有重复值时序号不跳号。

ORACLE中的ROW_NUMBEROVER分析函数的用法

ORACLE中的ROW_NUMBEROVER分析函数的用法

ORACLE中的ROW_NUMBEROVER分析函数的用法ROW_NUMBER(OVER(是ORACLE数据库中的一个分析函数,用来为结果集中的每一行分配一个唯一的序号。

ROW_NUMBER(OVER(的语法是:ROW_NUMBER( OVER ( [ PARTITION BY expr1 [, expr2, ...] ]ORDER BY clause )其中,PARTITIONBY子句可选,用来指定分区依据的列或表达式;ORDERBY子句用来指定排序的列或表达式。

ROW_NUMBER(OVER(常用在查询结果需要进行分页或者进行排序后获取前几行的场景中。

以下是ROW_NUMBER(OVER(的用法示例:示例1:查询员工表中每个部门的员工数,并按照员工数降序排序。

SELECT department_id, count(*) as employee_count,ROW_NUMBER( OVER (ORDER BY count(*) DESC) as rankFROM employeesGROUP BY department_idORDER BY count(*) DESC;在这个示例中,ROW_NUMBER(OVER(函数根据部门中的员工数进行降序排序,并为每个部门分配一个唯一的序号。

示例2:查询员工表中每个部门的员工数,并按照员工数降序排序,并且只返回前三名。

SELECT department_id, count(*) as employee_count,ROW_NUMBER( OVER (ORDER BY count(*) DESC) as rankFROM employeesGROUP BY department_idWHERE rank <= 3ORDER BY count(*) DESC;在这个示例中,ROW_NUMBER(OVER(函数的结果用于限制查询结果只返回前三名。

示例3:查询员工表中每个部门的员工信息,并按照部门和薪水进行排序。

Oracle分析函数的使用(主要是rollup用法)

Oracle分析函数的使用(主要是rollup用法)

Oracle分析函数的使⽤(主要是rollup⽤法)分析函数是oracle 8.1.6中就引⼊的⼀个全新的概念,为我们分析数据提供了⼀种简单⾼效的处理⽅式.在分析函数出现以前,我们必须使⽤⾃联查询,⼦查询或者内联视图,甚⾄复杂的存储过程实现的语句,现在只要⼀条简单的sql语句就可以实现了,⽽且在执⾏效率⽅⾯也有相当⼤的提⾼.分析函数的使⽤⽅法1. ⾃动汇总函数rollup,cube,2. rank 函数, rank,dense_rank,row_number3. lag,lead函数4. sum,avg,的移动增加,移动平均数5. ratio_to_report报表处理函数6. first,last取基数的分析函数本⼈在项⽬中由于⽤到⼩计、合计的统计,前⾯想到⽤union all,但这样有点⿇烦并且效率也不⾼,就从⽹上查到资料说是oracle 8i、oracl 9i、oracle 10g 中已经分析函数对数据统计的处理,于是就顺便学习了⼀下这些函数的⽤法,拿出来分享给⼤家共同学习。

1、Oracle ROLLUP和CUBE ⽤法Oracle的GROUP BY语句除了最基本的语法外,还⽀持ROLLUP和CUBE语句。

如果是Group by ROLLUP(A, B, C)的话,⾸先会对(A、B、C)进⾏GROUP BY,然后对(A、B)进⾏GROUP BY,然后是(A)进⾏GROUP BY,最后对全表进⾏GROUP BY操作。

如果是GROUP BY CUBE(A, B, C),则⾸先会对(A、B、C)进⾏GROUP BY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C),最后对全表进⾏GROUP BY操作。

grouping_id()可以美化效果。

除了使⽤GROUPING函数,还可以使⽤GROUPING_ID来标识GROUP BY的结果。

也可以 Group by Rollup(A,(B,C)) ,Group by A Rollup(B,C),…… 这样任意按⾃⼰想要的形式结合统计数据,⾮常⽅便。

oracle之分析函数

oracle之分析函数

Oracle 分析函数的使用Oracle 分析函数使用介绍分析函数是oracle816引入的一个全新的概念,为我们分析数据提供了一种简单高效的处理方式.在分析函数出现以前,我们必须使用自联查询,子查询或者内联视图,甚至复杂的存储过程实现的语句,现在只要一条简单的sql语句就可以实现了,而且在执行效率方面也有相当大的提高.下面我将针对分析函数做一些具体的说明.今天我主要给大家介绍一下以下几个函数的使用方法1. 自动汇总函数rollup,cube,2. rank 函数, rank,dense_rank,row_number3. lag,lead函数4. sum,avg,的移动增加,移动平均数5. ratio_to_report报表处理函数6. first,last取基数的分析函数基础数据1. 使用rollup函数的介绍select area_code,sum(local_fare) local_farefrom ttgroup by area_codeunion allselect'合计' area_code,sum(local_fare) local_fare from tt;1 0 UNION-ALL2 1 SORT (GROUP BY) (Cost=5 Card=1309 Bytes=24871)3 2 TABLE ACCESS (FULL) OF 'T' (Cost=2 Card=1309 Bytes=24871)4 1 SORT (AGGREGATE)5 4 TABLE ACCESS (FULL) OF 'T' (Cost=2 Card=1309 Bytes=17017)Statistics----------------------------------------------------------0 recursive calls0 db block gets6 consistent gets0 physical reads0 redo size561 bytes sent via SQL*Net to client503 bytes received via SQL*Net from client2 SQL*Net roundtrips to/from client1 sorts (memory)0 sorts (disk)6 rows processed下面是使用分析函数rollup得出的汇总数据的例子SQL> select nvl(area_code,'合计') area_code,sum(local_fare) local_fare2 from tt3 group by rollup(area_code);4 /AREA_CODE LOCAL_FARE---------- --------------5761 54225413.045762 52039619.605763 69186545.025764 53156768.465765 104548719.19合计333157065.31从上面的结果中我们很容易发现,每个统计数据所对应的行都会出现null,我们如何来区分到底是根据那个字段做的汇总呢,这时候,oracle的grouping函数就粉墨登场了.如果当前的汇总记录是利用该字段得出的,grouping函数就会返回1,否则返回01 select decode(grouping(area_code),1,'all area',to_char(area_code))area_code,2 decode(grouping(bill_month),1,'all month',bill_month) bill_month,3 sum(local_fare) local_fare4 from t5 group by cube(area_code,bill_month)6* order by area_code,bill_month nulls last07:07:29 SQL> /AREA_CODE BILL_MONTH LOCAL_FARE---------- --------------- --------------5761 200405 13060.435761 200406 13318.935761 200407 13710.275761 200408 14135.785761 all month 54225.415762 200405 12643.795762 200406 12795.065762 200407 13224.305762 200408 13376.475762 all month 52039.625763 200405 16649.785763 200406 17120.525763 200407 17487.495763 200408 17928.765763 all month 69186.545764 200405 12487.795764 200406 13295.195764 200407 13444.095764 200408 13929.695764 all month 53156.775765 200405 25057.745765 200406 26058.465765 200407 26301.885765 200408 27130.645765 all month 104548.72all area 200405 79899.532. rank函数的介绍问题2.我想查出这几个月份中各个地区的总话费的排名.为了将rank,dense_rank,row_number函数的差别显示出来,我们对已有的基础数据做一些修改,将5763的数据改成与5761的数据相同.1 update t t1 set local_fare = (2 select local_fare from t t23 where t1.bill_month = t2.bill_month4 and _type = _type5 and t2.area_code = '5761'6) where area_code = '5763'SQL> /update tt t1 set local_fare =(select local_fare from tt t2where t1.bill_month = t2.bill_monthand _type = _typeand t2.area_code ='5761')where area_code ='5763';8 rows updated.Elapsed: 00:00:00.01我们先使用rank函数来计算各个地区的话费排名.SQL> select area_code,sum(local_fare) local_fare,2 rank() over (order by sum(local_fare) desc) fare_rank3 from t4 group by area_codeselect area_code,sum(local_fare) local_fare,rank() over (order by sum(local_fare)desc) fare_rankfrom ttgroup by area_codeAREA_CODE LOCAL_FARE FARE_RANK---------- -------------- ----------5765 104548.72 15761 54225.41 25763 54225.41 25764 53156.77 45762 52039.62 5Elapsed: 00:00:00.01我们可以看到红色标注的地方出现了,跳位,排名3没有出现下面我们再看看dense_rank查询的结果.select area_code,sum(local_fare) local_fare,dense_rank() over (order by sum(local_fare)desc) fare_rankfrom ttgroup by area_code/AREA_CODE LOCAL_FARE FARE_RANK---------- -------------- ----------5765 104548.72 15761 54225.41 25763 54225.41 25764 53156.77 3 这是这里出现了第三名5762 52039.62 4Elapsed: 00:00:00.00在这个例子中,出现了一个第三名,这就是rank和dense_rank的差别,rank如果出现两个相同的数据,那么后面的数据就会直接跳过这个排名,而dense_rank则不会,差别更大的是,row_number哪怕是两个数据完全相同,排名也会不一样,这个特性在我们想找出对应没个条件的唯一记录的时候又很大用处select area_code,sum(local_fare) local_fare,row_number() over (order by sum(local_fare)desc) fare_rankfrom ttgroup by area_code/AREA_CODE LOCAL_FARE FARE_RANK---------- -------------- ----------5765 104548.72 15761 54225.41 25763 54225.41 35764 53156.77 45762 52039.62 5在row_nubmer函数中,我们发现,哪怕sum(local_fare)完全相同,我们还是得到了不一样排名,我们可以利用这个特性剔除数据库中的重复记录.这里的几个例子是为了说明这三个函数的基本用法。

Oracle之分析函数

Oracle之分析函数

Oracle之分析函数⼀、分析函数 1、分析函数 分析函数是Oracle专门⽤于解决复杂报表统计需求的功能强⼤的函数,它可以在数据中进⾏分组然后计算基于组的某种统计值,并且每⼀组的每⼀⾏都可以返回⼀个统计值。

2、分析函数和聚合函数的区别 普通的聚合函数⽤group by分组,每个分组返回⼀个统计值,⽽分析函数采⽤partition by分组,并且每组每⾏都可以返回⼀个统计值。

3、分析函数的形式 分析函数带有⼀个开窗函数over(),包含分析⼦句。

分析⼦句⼜由下⾯三部分组成: partition by :分组⼦句,表⽰分析函数的计算范围,不同的组互不相⼲; ORDER BY:排序⼦句,表⽰分组后,组内的排序⽅式; ROWS/RANGE:窗⼝⼦句,是在分组(PARTITION BY)后,组内的⼦分组(也称窗⼝),此时分析函数的计算范围窗⼝,⽽不是PARTITON。

窗⼝有两种,ROWS和RANGE; 使⽤形式如下:OVER(PARTITION BY xxx PORDER BY yyy ROWS BETWEEN rowStart AND rowEnd) 注:窗⼝⼦句在这⾥我只说rows⽅式的窗⼝,range⽅式和滑动窗⼝也不提。

⼆、OVER() 函数 1、sql 查询语句的 order by 和 OVER() 函数中的 ORDER BY 的执⾏顺序 分析函数是在整个sql查询结束后(sql语句中的order by的执⾏⽐较特殊)再进⾏的操作, 也就是说sql语句中的order by也会影响分析函数的执⾏结果: [1] 两者⼀致:如果sql语句中的order by满⾜分析函数分析时要求的排序,那么sql语句中的排序将先执⾏,分析函数在分析时就不必再排序; [2] 两者不⼀致:如果sql语句中的order by不满⾜分析函数分析时要求的排序,那么sql语句中的排序将最后在分析函数分析结束后执⾏排序。

2、分析函数中的分组/排序/窗⼝分析函数包含三个分析⼦句:分组(partition by),排序(order by),窗⼝(rows/range)窗⼝就是分析函数分析时要处理的数据范围,就拿sum来说,它是sum窗⼝中的记录⽽不是整个分组中的记录,因此我们在想得到某个栏位的累计值时,我们需要把窗⼝指定到该分组中的第⼀⾏数据到当前⾏, 如果你指定该窗⼝从该分组中的第⼀⾏到最后⼀⾏,那么该组中的每⼀个sum值都会⼀样,即整个组的总和。

oracle分析函数

oracle分析函数

oracle分析函数
Oracle分析函数是一组可用于处理数据集的函数。

它们可以帮助您计算数据的统计值,如求和、平均值、最小值和最大值。

此外,还可以对数据进行细粒度的分析,如数据分析、排序、汇总和聚合。

Oracle分析函数可以提高您的应用程序的性能,并使您能够缩短查询时间。

Oracle分析函数可以分为三类:统计函数、数据分析函数和排序函数。

统计函数可以帮助您计算数据集的基本统计信息,如求和、平均值、最小值和最大值。

数据分析函数可以帮助您对数据进行更细粒度的分析,如数据分组、汇总和聚合。

排序函数可以帮助您对数据进行排序,以便更好地分析数据。

Oracle分析函数的优点非常明显,它们可以提高您的应用程序的性能,而且可以缩短查询时间。

此外,它们还可以提供准确和可靠的数据。

因此,当您需要对数据进行分析时,Oracle分析函数是一个有用的工具。

Oracle分析函数是一个强大的工具,可以帮助您更有效地处理数据集,从而获得更准确、更可靠的结果。

它们可以帮助您更快地执行复杂的查询,并使您能够更准确地分析和理解数据。

因此,Oracle 分析函数可以极大地提高您的业务分析效率,从而给您带来更大的利润。

Oracle数据库分析函数用法

Oracle数据库分析函数用法

Oracle数据库分析函数⽤法⽬录1、什么是窗⼝函数?2、窗⼝函数——开窗3、⼀些分析函数的使⽤⽅法4、OVER()参数——分组函数5、OVER()参数——排序函数1、什么是窗⼝函数?窗⼝函数也属于分析函数。

Oracle从8.1.6开始提供窗⼝函数,窗⼝函数⽤于计算基于组的某种聚合值,窗⼝函数指定了分析函数⼯作的数据窗⼝⼤⼩,这个数据窗⼝⼤⼩可能会随着⾏的变化⽽变化。

与聚合函数的不同之处是:对于每个组返回多⾏,⽽聚合函数对于每个组只返回⼀⾏基本语法: ‹分析函数› over (partition by ‹⽤于分组的列名› order by ‹⽤于排序的列名›)。

语法中的‹分析函数›主要由序列函数(rank、dense_rank和row_number等组成)与聚合函数(sum、avg、count、max和min等)作为窗⼝函数组成。

从窗⼝函数组成上看,它是group by 和 order by的功能组合,group by分组汇总后改变了表的⾏数,⼀⾏只有⼀个类别,⽽partiition by则不会减少原表中的⾏数。

恰如窗⼝函数的组成,它同时具有分组和排序的功能,且不减少原表的⾏数。

OVER 关键字表⽰把函数当成窗⼝函数⽽不是聚合函数。

SQL 标准允许将所有聚合函数⽤做窗⼝函数,使⽤ OVER 关键字来区分这两种⽤法。

2、窗⼝函数——开窗OVER 关键字后的括号中经常添加选项⽤以改变进⾏聚合运算的窗⼝范围。

如果 OVER 关键字后的括号中的选项为空,则窗⼝函数会对结果集中的所有⾏进⾏聚合运算。

分析函数 over(partition by 列名 order by 列名 rows between 开始位置 and 结束位置)为什么叫开窗呢?因为在over()括号中的,partition() 函数可以将查询到的数据进⾏单独开⼀个窗⼝处理。

譬如,查询每个班级的学⽣的排名情况,查询每个国家的历年⼈⼝等,诸如此类,都是在查询到的每⼀个班级、每⼀个国家中都开⼀个窗⼝,单独去执⾏命令。

Oracle分析函数实践 - blog

Oracle分析函数实践 - blog

一、分享目的本次分享的目的是为了提高大家ORACLE 数据库SQL 使用技能,使大家能够写出高质量高性能的SQL 语句。

二、功能介绍分析函数是基于一组行来计算的。

这不同于聚集函数且广泛应用于OLAP 环境中。

Oracle 从8.1.6 开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行。

分析函数是Oracle 专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计值。

普通的聚合函数用group by 分组,每个分组返回一个统计值,而分析函数采用partition by 分组,并且每组每行都可以返回一个统计值。

分析函数带有一个开窗函数over(),包含三个分析子句:分组(partition by), 排序(order by), 窗口(rows) ,他们的使用形式如下:over(partition by xxx order by yyy rows between zzz)。

三、语法说明3.1 语法介绍functi on_n ame(<arg umen t1>,<ar gume nt2>,...)ove r(<P arti tion clause><Order by clause><Windows clau se>)3.2 参数说明(1)ove r是关键字,用于标识分析函数。

(2)<ana lyti c-fu ncti o n>是指定的分析函数的名字。

(3)<arg umen t>为参数,分析函数可以选取0-3个参数。

(4)分区子句<que ry-pa rtitio n-cl ause>的格式为:partition by<v alue_exp>[,valu e_ex pr]...关键字par titi on by 子句根据由分区表达式的条件逻辑地将单个结果集分成N 组。

oracle函数介绍_非著名函数之分析函数

oracle函数介绍_非著名函数之分析函数

ORACLE函数介绍非著名函数之分析函数1、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;2、NTILE(n) OVER([partition_clause] order_by_clause)ntile是个很有意思的统计函数。

它会按照你指定的组数(n)对记录做分组例如:SELECT t.*,ntile(5) over(order by value desc) FROM tmp1 t;3、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;4、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) bFROM TMP1group 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;5、PERCENTILE_DISC(n) WITHIN GROUP (ORDER BY col [DESC|ASC]) OVER(partition_clause)本函数功能与前面聚合函数处介绍的完全相同,只是一个是聚合函数,一个是分析函数。

Oracle分析函数使用的总结

Oracle分析函数使用的总结

Oracle分析函数使用总结1.使用评级函数评级函数(ranking function)用于计算等级、百分点、n分片等等,下面是几个常用到的评级函数:RANK():返回数据项在分组中的排名。

特点:在排名相等的情况下会在名次中留下空位DENSE_RANK():与RANK不同的是它在排名相等的情况下不会在名次中留下空位CUME_DIST():返回特定值相对于一组值的位置:他是“cumulative distribution”(累积分布)的简写PERCENT_RANK():返回某个值相对于一组值的百分比排名NTILE():返回n分片后的值,比如三分片、四分片等等ROW_NUMBER():为每一条分组纪录返回一个数字下面我们分别举例来说明这些函数的使用1)RANK()与DENSE-RANK()首先显示下我们的源表数据的结构及部分数据:SQL> desc all_sales;名称是否为空? 类型----------------------------------------- -------- -----------YEAR NOT NULL NUMBER(38)MONTH NOT NULL NUMBER(38)PRD_TYPE_ID NOT NULL NUMBER(38)EMP_ID NOT NULL NUMBER(38)AMOUNT NUMBER(8,2)SQL> select * from all_sales where rownum<11;YEAR MONTH PRD_TYPE_ID EMP_ID AMOUNT---------- ---------- ----------- ---------- ----------2003 1 1 21 10034.842003 2 1 21 15144.652003 3 1 21 20137.832003 4 1 21 25057.452003 5 1 21 17214.562003 6 1 21 15564.642003 7 1 21 12654.842003 8 1 21 17434.822003 9 1 21 19854.572003 10 1 21 21754.19已选择10行。

oracle分析函数汇总

oracle分析函数汇总

oracle分析函数--SQL*PLUS环境--1、GROUP BY子句--CREATE TEST TABLE AND INSERT TEST DATA. create table students(id number(15,0),area varchar2(10),stu_type varchar2(2),score number(20,2));insert into students values(1, '111', 'g', 80 );insert into students values(1, '111', 'j', 80 );insert into students values(1, '222', 'g', 89 );insert into students values(1, '222', 'g', 68 );insert into students values(2, '111', 'g', 80 );insert into students values(2, '111', 'j', 70 );insert into students values(2, '222', 'g', 60 );insert into students values(2, '222', 'j', 65 );insert into students values(3, '111', 'g', 75 );insert into students values(3, '111', 'j', 58 );insert into students values(3, '222', 'g', 58 );insert into students values(3, '222', 'j', 90 );insert into students values(4, '111', 'g', 89 );insert into students values(4, '111', 'j', 90 );insert into students values(4, '222', 'g', 90 );insert into students values(4, '222', 'j', 89 ); commit;col score format 999999999999.99--A、GROUPING SETSselect id,area,stu_type,sum(score) scorefrom studentsgroup by grouping sets((id,area,stu_type),(id,area),id) order by id,area,stu_type;/*--------理解grouping setsselect a, b, c, sum( d ) from tgroup by grouping sets ( a, b, c )等效于select * from (select a, null, null, sum( d ) from t group by a union allselect null, b, null, sum( d ) from t group by b union allselect null, null, c, sum( d ) from t group by c )*/--B、ROLLUPselect id,area,stu_type,sum(score) score from studentsgroup by rollup(id,area,stu_type)order by id,area,stu_type;/*--------理解rollupselect a, b, c, sum( d )from tgroup by rollup(a, b, c);等效于select * from (select a, b, c, sum( d ) from t group by a, b, c union allselect a, b, null, sum( d ) from t group by a, b union allselect a, null, null, sum( d ) from t group by a union allselect null, null, null, sum( d ) from t)*/--C、CUBEselect id,area,stu_type,sum(score) score from studentsgroup by cube(id,area,stu_type)order by id,area,stu_type;/*--------理解cubeselect a, b, c, sum( d ) from tgroup by cube( a, b, c)等效于select a, b, c, sum( d ) from tgroup by grouping sets(( a, b, c ),( a, b ), ( a ), ( b, c ),( b ), ( a, c ), ( c ),() )*/--D、GROUPING/*从上面的结果中我们很容易发现,每个统计数据所对应的行都会出现null,如何来区分到底是根据那个字段做的汇总呢,grouping函数判断是否合计列!*/select decode(grouping(id),1,'all id',id) id,decode(grouping(area),1,'all area',to_char(area)) area,decode(grouping(stu_type),1,'all_stu_type',stu_type) stu_type,sum(score) scorefrom studentsgroup by cube(id,area,stu_type)order by id,area,stu_type;--2、OVER()函数的使用--1、RANK()、DENSE_RANK() 的、ROW_NUMBER()、CUME_DIST()、MAX()、AVG()break on id skip 1select id,area,score from students order by id,area,score desc;select id,rank() over(partition by id order by score desc) rk,score from students;--允许并列名次、名次不间断select id,dense_rank() over(partition by id order by score desc) rk,score from students;--即使SCORE相同,ROW_NUMBER()结果也是不同select id,row_number() over(partition by ID order by SCORE desc) rn,score from students;select cume_dist() over(order by id) a, --该组最大row_number/所有记录row_numberrow_number() over (order by id) rn,id,area,score from students;select id,max(score) over(partition by id order by score desc) as mx,score from students; select id,area,avg(score) over(partition by id order by area) as avg,score from students; --注意有无order by的区别--按照ID求AVGselect id,avg(score) over(partition by id order by score desc rows between unbounded precedingand unbounded following ) as ag,score from students;--2、SUM()select id,area,score from students order by id,area,score desc;select id,area,score,sum(score) over (order by id,area) 连续求和, --按照OVER后边内容汇总求和sum(score) over () 总和, -- 此处sum(score) over () 等同于sum(score)100*round(score/sum(score) over (),4) "份额(%)"from students;select id,area,score,sum(score) over (partition by id order by area ) 连id续求和, --按照id内容汇总求和sum(score) over (partition by id) id总和, --各id的分数总和100*round(score/sum(score) over (partition by id),4) "id份额(%)",sum(score) over () 总和, -- 此处sum(score) over () 等同于sum(score)100*round(score/sum(score) over (),4) "份额(%)"from students;--4、LAG(COL,n,default)、LEAD(OL,n,default) --取前后边N条数据select id,lag(score,1,0) over(order by id) lg,score from students;select id,lead(score,1,0) over(order by id) lg,score from students;--5、FIRST_VALUE()、LAST_VALUE()select id,first_value(score) over(order by id) fv,score from students;select id,last_value(score) over(order by id) fv,score from students;。

Oracle常用函数nvl和decode小结

Oracle常用函数nvl和decode小结

数值函数函数功能实例结果abs 求绝对值函数abs(−5) 5sqrt 求平方根函数sqrt(2) 1.41421356 power 求幂函数power(2,3) 8cos 求余弦三角函数cos(3.14159) −1mod 求除法余数mod(1600, 300) 100ceil 求大于等于某数的最小整数ceil(2.35) 3floor 求小于等于某数的最大整数floor(2.35) 2round 按指定精度对十进制数四舍五入round(45.923, 1)round(45.923, 0)round(45.923,−1)45.94650trunc 按指定精度截断十进制数trunc(45.923, 1)trunc(45.923)trunc(45.923,−1)45.94540字符函数函数名称功能实例结果ascii 获得字符的ASCII码Ascii('A') 65 chr 返回与ASCII码相应的字符Chr(65) Alower 将字符串转换成小写lower ('SQLCourse')sql courseupper 将字符串转换成大写upper('SQLCourse')SQL COURSEinitca p 将字符串转换成每个单词以大写开头initcap('SQLcourse')Sql Courseconcat 连接两个字符串concat('SQL', 'Course')SQL Coursesubstr 给出起始位置和长度,返回子字符串substr('String',1,3)Strlength 求字符串的长度length('Wellcom')7instr 给出起始位置和出现的次数,求子字符串在字符串中出现的位置instr('String','r',1,1)3lpad 用字符填充字符串左侧到指定长度lpad('Hi',10,'-')--------Hirpad 用字符填充字符串右侧到指定长度rpad('Hi',10,'-')Hi--------trim 在一个字符串中去除另一个字去除的字符只能在左边或者右trim('S' FROM'SSMITH')MITH边的第一个符串(trim 整洁、修整)replac e 用一个字符串替换另一个字符串中的子字符串replace('ABC','B', 'D')ADC日期函数函数功能实例结果months_between 返回两个日期间的月份months_between ('04-11月-05','11-1月-01')57.7741935add_months 返回把月份数加到日期上的新日期add_months('06-月-03',1)add_months('06-月-03',-1)06-3月-0306-1月-03next_day 返回指定日期后的星期对应的新日期selectnext_day(to_date('2009-12-02','YYYY-MM-DD'),'星期一')from dual;2009-12-7last_day 返回指定日期所在的月的最后一天last_day('06-2月-03') 28-2月-03round 按指定格式对日期进行四舍五入round(to_date('13-2月-03'),'YEAR')round(to_date('13-2月-03'),'MONTH')round(to_date('13-2月-03'),'DAY')01-1月-0301-2月-0316-2月-03(按周四舍五入)trunc 对日期按指定方式进行截断trunc(to_date('06-2月-03'),'YEAR')trunc(to_date('06-2月-03'),'MONTH')trunc(to_date('06-2月-03'),'DAY')01-1月-0301-2月-0302-2月-03(按周截断)关于日期转换例子:SELECT TO_CHAR(sysdate,'YYYY-MM-DD HH24:MI:SS AM DY') FROM dual;SELECT TO_CHAR(sysdate,'YYYY"年"MM"月"DD"日"') FROM dual;其他函数函数功能实例结果nvl 空值转换函数nvl(null, '空') 空decode 实现分支功能decode(1,1, '男',2,'女')男userenv 返回环境信息userenv('LANGUAGE') SIMPLIFIED CHINESE_CHINA.ZHS16GBKgreatest 返回参数的最大值greatest(20,35,18,9) 35least 返回参数的最小值least(20,35,18,9) 95.高级查询(多表联合查询)组函数函数说明A VG 求平均值COUNT 求计数值,返回非空行数,*表示返回所有行MAX 求最大值MIN 求最小值SUM 求和STDDEV 求标准偏差,是根据差的平方根得到的V ARIANCE 求统计方差例子:SELECT job 职务 , SUM(sal) 工资总和 FROM empWHERE job != 'PRESIDENT'GROUP BY jobHAVING SUM(sal)>4500ORDER BY SUM(sal);分析函数以下三个分析函数用于计算一个行在一组有序行中的排位,序号从1开始ROW_NUMBER返回连续的排位,不论值是否相等RANK具有相等值的行排位相同,序数随后跳跃DENSE_RANK 具有相等值的行排位相同,序号是连续的例子:SELECT deptno, ename, sal, comm, RANK() OVER(PARTITION BY deptno ORDER BY sal DESC, comm) RANKFROM emp;SELECT ename, job, deptno, sal, ROW_NUMBER() OVER(ORDER BY sal DESC) AS SAL_RANKFROM SCOTT.EMP;SELECT d.dname, e.ename, e.sal, DENSE_RANK()OVER (PARTITION BY e.deptno ORDER BY e.sal DESC)AS DENRANKFROM emp e, dept d WHERE e.deptno = d.deptno;集合运算操作描述UNION 并集,合并两个操作的结果,去掉重复的部分UNION ALL 并集,合并两个操作的结果,保留重复的部分MINUS 差集,从前面的操作结果中去掉与后面操作结果相同的部分INTERSECT 交集,取两个操作结果中相同的部分系统定义同义词表同义词对象名称作用DICT DICTIONARY 数据字典CAT USER_CATALOG用户拥有的表、视图、同义词和序列CLU USER_CLUSTERS用户拥有的聚簇IND USER_INDEXES用户拥有的索引OBJ USER_OBJECTS用户拥有的对象SEQ USER_SEQUENCES用户拥有的序列SYN USER_SYNONYMS用户拥有的私有同义词COLS USER_TAB_COLUMNS用户拥有的表、视图和聚簇的列TABS USER_TABLES用户拥有的表补充函数rollup()合计函数,求合计cube ()合计函数比前一个更详细例子(也可以叫交叉报表交叉报表)create table test(sales varchar2(10),dest varchar2(10),revenue number)insert into test values('smith','hangzhou',1000);insert into test values('smith','wenzhou',2000);insert into test values('allen','wenzhou',3000);insert into test values('allen','wenzhou',4000);SELECT sales, nvl(dest,'合计'),SUM(revenue)FROM test GROUP BY CUBE(sales, dest);SELECT sales, nvl(dest,'合计'),SUM(revenue)FROM test GROUP BY ROLLUP(sales, dest);比CUBE少2原因是没有对hangzhou、wenzou 的综合进行统计nullif(exp1,exp2)如果相等返回null 不相等返回第一个oracle中decode函数1.DECODE函数相当于一条件语句(IF).它将输入数值与函数中的参数列表相比较,根据输入值返回一个对应值。

Oracle分析函数与分组关键字的用法

Oracle分析函数与分组关键字的用法

Oracle分析函数与分组关键字的用法以下是我以前工作中做报表常用的几个函数,在此分享一下,希望对大家有帮助。

(一)分析函数●row_numberPurposeROW_NUMBER is an analytic function. It assigns a unique number to each row to which it is applied (either each row in the partition or each row returned by the query), in the ordered sequence of rows specified in the order_by_clause, beginning with 1.You cannot use ROW_NUMBER or any other analytic function for expr. That is, you can use other built-in function expressions for expr, but you cannot nest analytic functions.按部门分组后根据工资排序,序号rn特征:连续、无并列select t.*, row_number() over(partitionby t.deptno orderby sal desc) rn from emp t;●rankPurposeRANK calculates the rank of a value in a group of values. Rows with equal values for the ranking criteria receive the same rank. Oracle then adds the number of tied rows to the tied rank to calculate the next rank. Therefore, the ranks may not be consecutive numbers.•As an aggregate function, RANK calculates the rank of a hypothetical row identified by the arguments of the function with respect to a given sort specification. The arguments of the function must all evaluate to constant expressions within each aggregate group, because they identify a single row within each group. The constant argument expressions and the expressions in the ORDER BY clause of the aggregate match by position. Therefore, the number of arguments must be the same and their types must be compatible.As an analytic function, RANK computes the rank of each row returned from a query with respect to the other rows returned by the query, based on the values of the value_exprs in the order_by_clause.按部门分组后根据工资排序,序号rn特征:不连续、有并列select t.*, rank() over(partitionby t.deptno orderby sal desc) rn from emp t;dense_rankPurposeDENSE_RANK computes the rank of a row in an ordered group of rows. The ranks are consecutive integers beginning with 1. The largest rank value is the number of unique values returned by the query. Rank values are not skipped in the event of ties. Rows with equal values for the ranking criteria receive the same rank.As an aggregate function, DENSE_RANK calculates the dense rank of a hypothetical row identified by the arguments of the function with respect to a given sort specification. The arguments of the function must all evaluate to constant expressions within each aggregate group, because they identify a single row within each group. The constant argument expressions and the expressions in the order_by_clause of the aggregate match by position. Therefore, the number of arguments must be the same and types must be compatible.As an analytic function, DENSE_RANK computes the rank of each row returned from a query with respect to the other rows, based on the values of the value_exprs in the order_by_clause.按部门分组后根据工资排序,序号rn特征:连续、有并列select t.*, dense_rank() over(partitionby t.deptno orderby sal desc) rn from emp t;(二)分组函数根据查询结果观察三者的区别,grouping sets用起来更灵活。

ORACLE_分析函数大全

ORACLE_分析函数大全

ORACLE_分析函数大全1.SUM:计算指定列的总和。

用法:SUM(column) OVER (PARTITION BY expression ORDER BY expression)2.AVG:计算指定列的平均值。

用法:AVG(column) OVER (PARTITION BY expression ORDER BY expression)3.COUNT:计算指定列的记录数。

用法:COUNT(column) OVER (PARTITION BY expression ORDER BY expression)4.MAX:计算指定列的最大值。

用法:MAX(column) OVER (PARTITION BY expression ORDER BY expression)5.MIN:计算指定列的最小值。

用法:MIN(column) OVER (PARTITION BY expression ORDER BY expression)6.FIRST_VALUE:计算指定列的第一个值。

用法:FIRST_VALUE(column) OVER (PARTITION BY expression ORDER BY expression)ST_VALUE:计算指定列的最后一个值。

用法:LAST_VALUE(column) OVER (PARTITION BY expression ORDER BY expression)8.LEAD:返回指定行后的值。

用法:LEAD(column, offset, default) OVER (PARTITION BY expression ORDER BY expression)G:返回指定行前的值。

用法:LAG(column, offset, default) OVER (PARTITION BY expression ORDER BY expression)10.RANK:计算指定列的排名(相同值有相同的排名,相同排名后续排名跳过)。

分析函数总结(oracle技术交流群)

分析函数总结(oracle技术交流群)

分析函数的基础语法oracle分析函数的语法:function_name(arg1,arg2,...)over(<partition-clause> <order-by-clause ><windowing clause>)说明:1. partition-clause 数据记录集分组2. order-by-clause 数据记录集排序3. windowing clause 功能超级壮大、比较复杂,概念分析函数在操作行的集合。

有三种开窗方式: range、row、specifying。

分析函数的四大要点Analytic FunctionPARTITION BY ORDER BYROWS Vs RANGEUNBOUNDED PRECEDING FOLLOWING CURRENT ROW1.有的分析函数能够带window,有的不能带window子句,不能带window子句的比如rank,dense_rank,row_number,FIRST,LAST,lead,lag能够带windows的比如count,SUM,AVG,MIN,MAX,first_value,last_value。

FIRST,LAST里的分析函数部份order BY都是不许诺的有的分析函数,比如row_number,dense_rank,rank是必需要有order BY的。

BY 是按字段值将对应的行分组(不能带括号,带括号的是model和PARTITIONED outer JOIN利用的),ORDER BY 是组内行的顺序,window子句决定每行对应的窗口范围BY ,ORDER BY ,window子句一起决定了当前行对应的窗口范围,当前行分析函数值确实是基于那个窗口计算的4.注意partition BY,ORDER BY,window子句的关系window子句是在partition by和order BY前提下设定当前行对应的窗口范围的,因此必需有order by才能写window子句。

Oracle开发专题之:分析函数总结

Oracle开发专题之:分析函数总结

【原】Oracle开发专题之:分析函数总结这一篇是对前面所有关于分析函数的文章的总结:一、统计方面:Sum() Over ([Partition by ][Order by ])Sum() Over ([Partition by ][Order by ]Rows Between Preceding And Following)Sum() Over ([Partition by ][Order by ]Rows Between Preceding And Current Row)Sum() Over ([Partition by ][Order by ]Range Between Interval '''Day' PrecedingAnd Interval '''Day' Following )具体请参考《Oracle开发专题之:分析函数(OVER)》和《Oracle开发专题之:窗口函数》二、排列方面:Rank() Over ([Partition by ][Order by ][Nulls First/Last])Dense_rank() Over ([Patition by ][Order by ][Nulls First/Last])Row_number() Over ([Partitionby ][Order by ][Nulls First/Last])Ntile() Over ([Partition by ][Order by ])具体请参考《Oracle开发专题之:分析函数2》三、最大值/最小值查找方面:Min()/Max() Keep (Dense_rank First/Last [Partition by ][Order by ]) 具体请参考《Oracle开发专题之:分析函数3》四、首记录/末记录查找方面:First_value / Last_value(Sum() Over ([Patition by ][Order by ]Rows Between Preceding And Following ))具体请参考《Oracle开发专题之:窗口函数》五、相邻记录之间比较方面:Lag(Sum(), 1) Over([Patition by ][Order by ])。

Oracle开发之分析函数简介Over用法

Oracle开发之分析函数简介Over用法

Oracle开发之分析函数简介Over⽤法⼀、Oracle分析函数简介:在⽇常的⽣产环境中,我们接触得⽐较多的是OLTP系统(即Online Transaction Process),这些系统的特点是具备实时要求,或者⾄少说对响应的时间多长有⼀定的要求;其次这些系统的业务逻辑⼀般⽐较复杂,可能需要经过多次的运算。

⽐如我们经常接触到的电⼦商城。

在这些系统之外,还有⼀种称之为OLAP的系统(即Online Aanalyse Process),这些系统⼀般⽤于系统决策使⽤。

通常和数据仓库、数据分析、数据挖掘等概念联系在⼀起。

这些系统的特点是数据量⼤,对实时响应的要求不⾼或者根本不关注这⽅⾯的要求,以查询、统计操作为主。

我们来看看下⾯的⼏个典型例⼦:①查找上⼀年度各个销售区域排名前10的员⼯②按区域查找上⼀年度订单总额占区域订单总额20%以上的客户③查找上⼀年度销售最差的部门所在的区域④查找上⼀年度销售最好和最差的产品我们看看上⾯的⼏个例⼦就可以感觉到这⼏个查询和我们⽇常遇到的查询有些不同,具体有:①需要对同样的数据进⾏不同级别的聚合操作②需要在表内将多条数据和同⼀条数据进⾏多次的⽐较③需要在排序完的结果集上进⾏额外的过滤操作⼆、Oracle分析函数简单实例:下⾯我们通过⼀个实际的例⼦:按区域查找上⼀年度订单总额占区域订单总额20%以上的客户,来看看分析函数的应⽤。

【1】测试环境:复制代码代码如下:SQL> desc orders_tmp;Name Null? Type----------------------- -------- ----------------CUST_NBR NOT NULL NUMBER(5)REGION_ID NOT NULL NUMBER(5)SALESPERSON_ID NOT NULL NUMBER(5)YEAR NOT NULL NUMBER(4)MONTH NOT NULL NUMBER(2)TOT_ORDERS NOT NULL NUMBER(7)TOT_SALES NOT NULL NUMBER(11,2)【2】测试数据:复制代码代码如下:SQL> select * from orders_tmp;CUST_NBR REGION_ID SALESPERSON_ID YEAR MONTH TOT_ORDERS TOT_SALES---------- ---------- -------------- ---------- ---------- ---------- ----------11 7 11 2001 7 2 122044 5 4 2001 10 2 378027 6 7 2001 2 3 375010 6 8 2001 1 2 2169110 6 7 2001 2 3 4262415 7 12 2000 5 6 2412 7 9 2000 6 2 506581 52 20003 2 444941 5 1 2000 92 748642 5 4 20003 2 350602 5 4 2000 4 4 64542 5 1 2000 10 4 355804 5 4 2000 12 2 3919013 rows selected.【3】测试语句:复制代码代码如下:SQL> select o.cust_nbr customer,o.region_id region,sum(o.tot_sales) cust_sales,sum(sum(o.tot_sales)) over(partition by o.region_id) region_sales from orders_tmp owhere o.year = 2001group by o.region_id, o.cust_nbr;CUSTOMER REGION CUST_SALES REGION_SALES---------- ---------- ---------- ------------4 5 37802 378027 6 3750 6806510 6 64315 6806511 7 12204 12204三、分析函数OVER解析:请注意上⾯的绿⾊⾼亮部分,group by的意图很明显:将数据按区域ID,客户进⾏分组,那么Over这⼀部分有什么⽤呢?假如我们只需要统计每个区域每个客户的订单总额,那么我们只需要group by o.region_id,o.cust_nbr就够了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Oracle中分析函数用法小结一.分析函数适用场景:○1需要对同样的数据进行不同级别的聚合操作○2需要在表内将多条数据和同一条数据进行多次的比较○3需要在排序完的结果集上进行额外的过滤操作二.分析函数语法:FUNCTION_NAME(<argument>,<argument>...)OVER(<Partition-Clause><Order-by-Clause><Windowing Clause>)例:sum(sal) over (partition by deptno order by ename) new_aliassum就是函数名(sal)是分析函数的参数,每个函数有0~3个参数,参数可以是表达式,例如:sum(sal+comm) over 是一个关键字,用于标识分析函数,否则查询分析器不能区别sum()聚集函数和sum()分析函数partition by deptno 是可选的分区子句,如果不存在任何分区子句,则全部的结果集可看作一个单一的大区order by ename 是可选的order by 子句,有些函数需要它,有些则不需要.依靠已排序数据的那些函数,如:用于访问结果集中前一行和后一行的LAG和LEAD,必须使用,其它函数,如AVG,则不需要.在使用了任何排序的开窗函数时,该子句是强制性的,它指定了在计算分析函数时一组内的数据是如何排序的.1)FUNCTION子句ORACLE提供了26个分析函数,按功能分5类分析函数分类等级(ranking)函数:用于寻找前N种查询开窗(windowing)函数:用于计算不同的累计,如SUM,COUNT,AVG,MIN,MAX等,作用于数据的一个窗口上例:sum(t.sal) over (order by t.deptno,t.ename) running_total,sum(t.sal) over (partition by t.deptno order by t.ename) department_total制表(reporting)函数:与开窗函数同名,作用于一个分区或一组上的所有列例:sum(t.sal) over () running_total2,sum(t.sal) over (partition by t.deptno) department_total2制表函数与开窗函数的关键不同之处在于OVER语句上缺少一个ORDER BY子句!LAG,LEAD函数:这类函数允许在结果集中向前或向后检索值,为了避免数据的自连接,它们是非常有用的.VAR_POP,VAR_SAMP,STDEV_POPE及线性的衰减函数:计算任何未排序分区的统计值2)PARTITION子句按照表达式分区(就是分组),如果省略了分区子句,则全部的结果集被看作是一个单一的组3)ORDER BY子句分析函数中ORDER BY的存在将添加一个默认的开窗子句,这意味着计算中所使用的行的集合是当前分区中当前行和前面所有行,没有ORDER BY时,默认的窗口是全部的分区在Order by 子句后可以添加nulls last,如:order by comm desc nulls last 表示排序时忽略comm列为空的行.4)WINDOWING子句用于定义分析函数将在其上操作的行的集合Windowing子句给出了一个定义变化或固定的数据窗口的方法,分析函数将对这些数据进行操作默认的窗口是一个固定的窗口,仅仅在一组的第一行开始,一直继续到当前行,要使用窗口,必须使用ORDER BY子句根据2个标准可以建立窗口:数据值的范围(RANGES)或与当前行的行偏移量.5)Rang窗口Range 5 preceding:将产生一个滑动窗口,他在组中拥有当前行以前5行的集合ANGE窗口仅对NUMBERS和DATES起作用,因为不可能从VARCHAR2中增加或减去N个单元另外的限制是ORDER BY中只能有一列,因而范围实际上是一维的,不能在N维空间中例:avg(t.sal) over(order by t.hiredate asc range 100 preceding) 统计前100天平均工资6)Row窗口利用ROW分区,就没有RANGE分区那样的限制了,数据可以是任何类型,且ORDER BY 可以包括很多列7)Specifying窗口UNBOUNDED PRECEDING:这个窗口从当前分区的每一行开始,并结束于正在处理的当前行CURRENT ROW:该窗口从当前行开始(并结束)Numeric Expression PRECEDING:对该窗口从当前行之前的数字表达式(Numeric Expression)的行开始,对RANGE来说,从行序值小于数字表达式的当前行的值开始. Numeric Expression FOLLOWING:该窗口在当前行Numeric Expression行之后的行终止(或开始),且从行序值大于当前行Numeric Expression行的范围开始(或终止)range between 100 preceding and 100 following:当前行100前, 当前行100后注意:分析函数允许你对一个数据集进排序和筛选,这是SQL从来不能实现的.除了最后的Order by子句之外,分析函数是在查询中执行的最后的操作集,这样的话,就不能直接在谓词中使用分析函数,即不能在上面使用where或having子句!!!下面我们通过一个实际的例子:按区域查找上一年度订单总额占区域订单总额20%以上的客户,来看看分析函数的应用。

【1】测试环境:SQL>desc orders_tmp;Name Null? Type----------------------- -------- ----------------CUST_NBR NOT NULL NUMBER(5)REGION_ID NOT NULL NUMBER(5)SALESPERSON_ID NOT NULL NUMBER(5)YEAR NOT NULL NUMBER(4)MONTH NOT NULL NUMBER(2)TOT_ORDERS NOT NULL NUMBER(7)TOT_SALES NOT NULL NUMBER(11,2)【2】测试数据:SQL>select*from orders_tmp;CUST_NBR REGION_ID SALESPERSON_ID YEAR MONTH TOT_ORDERS TOT_SALES---------- ---------- -------------- ---------- ---------- ---------- ----------117112001721220445420011023780276720012337501068200112216911067200123426241571220005624127920006250658152200032444941512000927486425420003235060254200044645425120001043558045420001223919013 rows selected.【3】测试语句:SQL>select o.cust_nbr customer,2 o.region_id region,3sum(o.tot_sales) cust_sales,4sum(sum(o.tot_sales)) over(partition by o.region_id) region_sales5from orders_tmp o6where o.year=20017group by o.region_id, o.cust_nbr;CUSTOMER REGION CUST_SALES REGION_SALES---------- ---------- ---------- ------------4537802378027637506806510664315680651171220412204三、分析函数OVER解析:请注意上面的绿色高亮部分,group by的意图很明显:将数据按区域ID,客户进行分组,那么Over这一部分有什么用呢?假如我们只需要统计每个区域每个客户的订单总额,那么我们只需要group by o.region_id,o.cust_nbr就够了。

但我们还想在每一行显示该客户所在区域的订单总额,这一点和前面的不同:需要在前面分组的基础上按区域累加。

很显然group by和sum是无法做到这一点的(因为聚集操作的级别不一样,前者是对一个客户,后者是对一批客户)。

这就是over函数的作用了!它的作用是告诉SQL引擎:按区域对数据进行分区,然后累积每个区域每个客户的订单总额(sum(sum(o.tot_sales)))总结:①Over函数指明在那些字段上做分析,其内跟Partition by表示对数据进行分组。

注意Partition by可以有多个字段。

②Over函数可以和其它聚集函数、分析函数搭配,起到不同的作用。

例如这里的SUM,还有诸如Rank,Dense_rank等。

四.常用分析函数:1. 一般聚合函数包括AVG(均值),COUNT(计数),MAX(最大值),MIN(最小值),SUM(求和),FIRST_VALUE(首值),LAST_VALUE(末值),LAG(当前行之前),LEAD(当前行之后)等2.统计类函数包括CORR(变量关联强度),COVAR_POP(总体协方差),C0VAR_SAMP(样本协方差),CUME_DIST(累积分布),STDDEV(标准偏离),STDDEV_POP(总体VAR值开根),STDDEV_SAMP(样本VAR值开根) VAR_POP(总体VAR值),VAR_SAMP(样本VAR值)等.3.排名函数包括ROW_NUMBER,DENSE_RANK,RANK①ROW_NUMBER:Row_number函数返回一个唯一的值,当碰到相同数据时,排名按照记录集中记录的顺序依次递增。

②DENSE_RANK:Dense_rank函数返回一个唯一的值,除非当碰到相同数据时,此时所有相同数据的排名都是一样的。

③RANK:Rank函数返回一个唯一的值,除非遇到相同的数据时,此时所有相同数据的排名是一样的,同时会在最后一条相同记录和下一条不同记录的排名之间空出排名。

4.报表函数包括Ratio_to_reportFirst/Last排名查询:想象一下下面的情形:找出订单总额最多、最少的客户。

相关文档
最新文档