一、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() 相同,返回不同排名;排名連續式。