轉(zhuǎn)載自:http://blog.csdn.net/ly0309/article/details/7008008
RANK ( ) OVER ( [query_partition_clause] order_by_clause )
DENSE_RANK ( ) OVER ( [query_partition_clause] order_by_clause )
可實(shí)現(xiàn)按指定的字段分組排序萝挤,對(duì)于相同分組字段的結(jié)果集進(jìn)行排序,
其中PARTITION BY 為分組字段明肮,ORDER BY 指定排序字段
over不能單獨(dú)使用怠噪,要和分析函數(shù):rank(),dense_rank(),row_number()等一起使用。
其參數(shù):over(partition by columnname1 order by columnname2)
含義:按columname1指定的字段進(jìn)行分組排序绿映,或者說(shuō)按字段columnname1的值進(jìn)行分組排序喉脖。
例如:employees表中薄风,有兩個(gè)部門的記錄:department_id =10和20
select department_id昔搂,rank() over(partition by department_id order by salary) from employees就是指在部門10中進(jìn)行薪水的排名句惯,在部門20中進(jìn)行薪水排名土辩。如果是partition by org_id,則是在整個(gè)公司內(nèi)進(jìn)行排名抢野。
以下是個(gè)人見解:
sql中的over函數(shù)和row_numbert()函數(shù)配合使用脯燃,可生成行號(hào)∶杀#可對(duì)某一列的值進(jìn)行排序辕棚,對(duì)于相同值的數(shù)據(jù)行進(jìn)行分組排序。如下表:
執(zhí)行語(yǔ)句:select row_number() over(order by AID DESC) as rowid,* from bb后的結(jié)果如下:
rowid標(biāo)識(shí)行號(hào)有了,同時(shí)AID也按降序排列逝嚎。AID有重復(fù)的記錄扁瓢,如果要?jiǎng)h除rowid為2所對(duì)應(yīng)的記錄則可以:
with [a] as
(select row_number() over(order by AID desc) as rowid,* from bb)
delete from [a] where rowid=2
如果查看rowid 為5所對(duì)應(yīng)的記錄的信息,可以:
with [b] as
(select row_number() over(order by AID desc) as rowid,* from bb)
select * from [b] where rowid=5
注意:
over里的order只能查查詢里的原始數(shù)據(jù)進(jìn)行操作补君,不會(huì)對(duì)計(jì)算出的新值或新字段起作用引几。
msdn中的說(shuō)法如下:
<ORDER BY 子句> 只能引用通過(guò) FROM 子句可用的列。<ORDER BY 子句>不能與聚合窗口函數(shù)一起使用