1
NTILE()
这个函数书上给的说明是:返回n分片后的值,如三分片、四分片等。不太理解哦,这个分片具体指的是什么意思?2
CUME_DIST() :返回特定值相对于一组值的位置
和PERCENT_RANK() : 返回某个值相对于一组值的百分比排名
给个例子吧
select
prd_type_id,sum(amount),
CUME_DIST() OVER (ORDER BY SUM(amount) DESC) AS cume_dist
PERCENT_RANK() OVER (ORDER BY SUM(amount) DESC) AS percent_rank
FROM all_sales
WHERE year=2003
GROUP BY prd_type_id
ORDER BY prd_type_idPRD_TYPE_ID SUM(AMOUNT) CUME_DIST PERCENT_RANK
------------ ------------ --------- -------------
1 905081 .4 .25
2 186381 1 1
3 478270 .6 .5
4 402751 .8 .75
5 .2 0比较愚钝,看不太懂这两个函数的解释,结合例子中的后两列也不太明白。麻烦哪位帮忙解释一下,谢谢了。
NTILE()
这个函数书上给的说明是:返回n分片后的值,如三分片、四分片等。不太理解哦,这个分片具体指的是什么意思?2
CUME_DIST() :返回特定值相对于一组值的位置
和PERCENT_RANK() : 返回某个值相对于一组值的百分比排名
给个例子吧
select
prd_type_id,sum(amount),
CUME_DIST() OVER (ORDER BY SUM(amount) DESC) AS cume_dist
PERCENT_RANK() OVER (ORDER BY SUM(amount) DESC) AS percent_rank
FROM all_sales
WHERE year=2003
GROUP BY prd_type_id
ORDER BY prd_type_idPRD_TYPE_ID SUM(AMOUNT) CUME_DIST PERCENT_RANK
------------ ------------ --------- -------------
1 905081 .4 .25
2 186381 1 1
3 478270 .6 .5
4 402751 .8 .75
5 .2 0比较愚钝,看不太懂这两个函数的解释,结合例子中的后两列也不太明白。麻烦哪位帮忙解释一下,谢谢了。
写了详细的博客 你看看吧
http://hi.baidu.com/loveyurui/blog/item/b0269f536019ba2d43a75b01.html
例如ntile(5)over(order by a)
那么记录将被从小到大分成5部分,a值最小的第一部分为1,最后一部分为5
运行下面代码试试
select ntile(5)over(order by rn),rn from(
select power(rownum,2) rn from dual
connect by rownum<10)
2.cume_dist
cumulative distribution累积分布
尝试这个例子
select cume_dist()over(order by rn ),rn from(
select rownum+10 rn from dual
connect by rownum<=10)
将order by rn 后添上desc看看有什么变化,rownum<=10分别改成5,6,7再试试
cume_dist,使用分析函数的一部分里有n条记录,就将1分成n等分,按order by 的顺序,1/n,2/n,..1依次赋值
这个和ntile其实挺相似percent_rank和cume_dist类似,不同的只是cume_dist从1/n开始取值,而percent_rank从0开始取值,然后1/(n-1),2/(n-1)...
且,例如order by rn,其中几条记录rn相同的情况下
这几条记录中percent_rank值是一样的,但取最小的那个,
cume_dist的值也一样,但取最大
默认空值为最大
试试
select PERCENT_RANK()over( order by rn ),cume_dist()over(order by rn),rn from(
select rownum*rownum rn from dual
connect by rownum<=7
union all
select null from dual
union all
select null from dual);
select PERCENT_RANK()over( order by rn ),cume_dist()over(order by rn)
from(select trunc(rownum/3) rn from dual connect by rownum<=10)