oracle,分析函数,得到的排名怎么取值函数

二次元同好交流新大陆
扫码下载App
汇聚2000万达人的兴趣社区下载即送20张免费照片冲印
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(2716)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_084067',
blogTitle:'oracle中的分析函数sum over\\lag over\\lead over\\rank over\\first_value over',
blogAbstract:'分析函数,最早是从ORACLE8.1.6开始出现的,它的设计目的是为了解决诸如“累计计算”,“找出分组内百分比”,“前-N条查询”,“移动平均数计算”\"等问题。其实大部分的问题都可以用PL/SQL解决,但是它的性能并不能达到你所期望的效果。分析函数是SQL言语的一种扩充,它并不是仅仅试代码变得更简单而已,它的速度比纯粹的SQL或者PL/SQL更快。现在这些扩展已经被纳入了美国国家标准化组织SQL委员会的SQL规范说明书中。 && 分析函数是在一个记录行分组的基础上计算它们的总值。与集合函数不同,他们返回各分组的多行记录。行的分组被称窗口,并通过分析语句定义。对于每记录行,定义了一个“滑动”窗口。该窗口确定“当前行”计算的范围。窗口的大小可由各行的实际编号或由时间等逻辑间隔确定。 &&& 除了ORDER BY(',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:2,
publishTime:5,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}我的网站,欢迎您的光临!
当前位置: >
oracle的几个分析函数
编辑:admin
ORACLE函数
oracle的几个分析函数
1. 自动汇总函数rollup,cube,&
2. rank 函数, rank,dense_rank,row_number&
3. lag,lead函数&
4. sum,avg,的移动增加,移动平均数&
5. ratio_to_report报表处理函数&
6. first,last取基数的分析函数&
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),&& 这样任意按自己想要的形式结合统计数据,非常方便。&
2、Rank的用法&
& & & &功能描述:根据ORDER BY子句中表达式的值,从查询返回的每一行,计算它们与其它行的相对位置。组内的数据按ORDER BY子句排序,然后给每一行赋一个号,从而形成一个序列,该序列从1开始,往后累加。每次ORDER BY表达式的值发生变化时,该序列也随之增加。有同样值的行得到同样的数字序号(认为null时相等的)。然而,如果两行的确得到同样的排序,则序数将随后跳跃。若两行序数为1,则没有序数2,序列将给组中的下一行分配值3,DENSE_RANK则没有任何跳跃。&
& & & &rank()是跳跃排序,比如有两个第二名时接下来就是第四名(同样是在各个分组内)&
& & & &dense_rank()l是连续排序,比如有两个第二名时仍然跟着第三名。 &
3、First的用法&
& & & &功能描述:从DENSE_RANK返回的集合中取出排在最前面的一个值的行(可能多行,因为值可能相等),因此完整的语法需要在开始处加上一个集合函数以从中取出记录。&
4、Last的用法&
& & &功能描述:从DENSE_RANK返回的集合中取出排在最后面的一个值的行(可能多行,因为值可能相等),因此完整的语法需要在开始处加上一个集合函数以从中取出记录。&
5、Lag的用法&
& & & &功能描述:可以访问结果集中的其它行而不用进行自连接。它允许去处理游标,就好像游标是一个数组一样。在给定组中可参考当前行之前的行,这样就可以从组中与当前行一起选择以前的行。Offset是一个正整数,其默认值为1,若索引超出窗口的范围,就返回默认值(默认返回的是组中第一行),其相反的函数是LEAD。
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
本类排行榜<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&1.评级函数:
用于等级、百分点、n分片等。
返回数据项在分组中的排名,排名相等会在名次中留下空位
DENSE_RANK()
返回数据项在分组中的排名,排名相等会在名次中不会留下空位
CUME_DIST()
返回特定值对于一组值的位置&cumulative distribution&(累积分布)
PERCENT_RANK()(
返回某个值相对于一组值的百分比排名
返回n分片后的值
ROW_NUMBER()
为每条记录返回一个数字
RANK()、DENSE_RANK()
RANK()在出现等级相同的元素时预留为空,DENSE_RANK()不会。
Eg:某产品类型有两个并列第一
RANK():第一二为1,第三位3
DENSE_RANK():第一二为1,第三位2
1 SELECT2 column_name,3 RANK() OVER (ORDER BY column_name DESC) AS rank,4 DENSE_RANK() OVER (ORDER BY SUM(column_name) DESC) AS dense_rank5 FROM table_name
OVER 需要,括号内为编号顺序注意:order by 时,desc NULL 值排在首位,ASC时NULL值排在末尾
可以通过NULLS LAST、NULLS FIRST 控制
RANK() OVER (ORDER BY column_name DESC NULLS LAST)
PARTITION BY&分组排列顺序
RANK() OVER(PARTITION BY month ORDER BY column_name DESC)
这样,就会按照month 来分,即所需要排列的信息先以month 的值来分组,在分组中排序,各个分组间不干涉
ROLLUP、CUBE、GROUP SETS (只显示小计信息) 与 RANK() 结合使用
&CUME_DIST()、PERCENT_RANK()
反百分比函数:PERCENTILE_DISC(x), PERCENTILE_CONT(x)
ROW_NUMBER()
ROW_NUMBER()从1开始,为每条记录返回一个数字
SELECTROW_NUMBER() OVER (ORDER BY column_name DESC)AS row_nameFROM table_
2.窗口函数:
可以计算一定范围内、一定值域内、或者一段时间内的累积和以及移动平均值等。
可以结合聚集函数SUM() 、AVG() 等使用。
可以结合FIRST_VALUE() 和LAST_VALUE(),返回窗口的第一个和最后一个值
计算累积和:
eg:统计1-12月的累积销量,即1月为1月份的值,2月为1.2月份值的和,3月为123月份的和,12月为1-12月份值的和
SELECTmonth,SUM(amount) month_amount,SUM( SUM(amount)) OVER (ORDER BY month ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_amountFROM table_nameGROUP BY monthORDER BY month;
其中:SUM( SUM(amount)) 内部的SUM(amount)为需要累加的值,在上述可以换为 month_amountORDER BY month 按月份对查询读取的记录进行排序,就是窗口范围内的排序ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 定义起点和终点,UNBOUNDED PRECEDING 为起点,表明从第一行开始, CURRENT ROW为默认值,就是这一句等价于:ROWS UNBOUNDED PRECEDING
PRECEDING:在前
的意思。FOLLOWING: 在后
的意思。计算前3个月之间的和
SUM( SUM(amount)) OVER (ORDER BY month ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) AS cumulative_amount
SUM( SUM(amount)) OVER (ORDER BY month 3 PRECENDING) AS cumulative_amount
前后一个月之间的和
SUM( SUM(amount)) OVER (ORDER BY month ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS cumulative_amount
窗体第一条和最后一条的值
FIRST_VALUE(SUM(amount)) OVER (ORDER BY month ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) ASLAST_VALUE(SUM(amount)) OVER (ORDER BY month ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS
这样就可以获得该行上一行和下一行的值3.报表函数:用于执行跨越分组和组内分区的计算
(这里的组应该指的是 ORDER BY 的分组)
SUM(column_name1) OVER(PARTITION BY
column_name2)
这样,会将数据按column_name2分组,然后求column_name1的和,但在表输出的时候是按ORDER BY 格式输出这样输出列会重复,例如相同的column_name2 会输出相同的column_name14.LAG()、LEAD()获得相对于当前记录指定距离的那条记录的数据LAG()为向前、LEAD()为向后
LAG(column_name1,1) OVER(ORDER BY column_name2)LEAG(column_name1,1) OVER(ORDER BY column_name2)
这样就获得前一条、后一条的数据
5.FIRST、LAST
&获得一个排序分组中的第一个值和组后一个值。可以与分组分组函数结合。
SELECTMIN(month) KEEP(DENSE_RANK FIRST ORDER BY SUM(amount)) AS highest_sales_month,MIN(month) KEEP(DENSE_RANK LAST ORDER BY SUM(amount)) AS lows_sales_monthFROM table_nameGROUP BY monthORDER BY month;
这样就可以求得一年中销量最高和最低的月份。注意:输出的是月份,但是用SUM(amount)来判断。
6.使用线性回归函数
7.使用假想评级与分布函数
阅读(...) 评论()

我要回帖

更多关于 二次函数取值范围 的文章

 

随机推荐