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比较愚钝,看不太懂这两个函数的解释,结合例子中的后两列也不太明白。麻烦哪位帮忙解释一下,谢谢了。

解决方案 »

  1.   

    这个我用过 
    写了详细的博客  你看看吧
    http://hi.baidu.com/loveyurui/blog/item/b0269f536019ba2d43a75b01.html
      

  2.   

    1.ntile分片
    例如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)