Oracle之分析函數、開窗函數

一、rank() over(partition by 字段1 order by 字段2)

從最經典的一個例子來說:

這是原始表結構:



現在需要增加一列,用來統計每天不同城市的完成率排名。

這意味着要對其分組,按時間分組,並且同一時間返回多個結果

普通分組函數(group by按某一個條件分組,必須要使用聚合函數,每組返回一個結果

這就需要使用rank() over(partition by  字段1 order by 字段2)函數,即分析函數(partition by)+開窗函數(order by)



select a.*,rank() over(partition by kpi_date order by 完成率 desc) 排名 from xxx_bb_s3_qs a
order by kpi_date desc,完成率 desc;


partition by 字段1  是指按照字段1進行分組

order by 字段2  是指按照字段2進行排序


二、sum(字段1) over(partition by 字段2 order by 字段3)

參考了這篇博文:http://blog.csdn.net/rfb0204421/article/details/7672207













三、rank() ,dense_rank()和 row_number() 區別

SQL> select region_id, customer_id, sum(customer_sales) total,
  
2         rank() over(order by sum(customer_sales) desc) rank,
  
3         dense_rank() over(order by sum(customer_sales) desc) dense_rank,
  
4         row_number() over(order by sum(customer_sales) desc) row_number
  
5    from user_order
  
6   group by region_id, customer_id;

 REGION_ID CUSTOMER_ID      TOTAL       RANK DENSE_RANK ROW_NUMBER
---------- ----------- ---------- ---------- ---------- ----------
                                                   rank  dense_rank  row_number
         
8          18                1253840         11         11         11
         
5           2                 1224992         12         12         12
         
9          23                1224992         12         12         13
         
9          24                1224992         12         12         14
        
10          30               1216858         15           13            15

rank()  相同,返回相同排名;排名跳躍式。

dense_rank()  相同,返回相同排名;排名連續式

row_number() 相同,返回不同排名;排名連續式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章