| 这个语句将返回如下表所示的结果:
| Name | DateOrdered | TotalOrderAmount | BestCustomer | | Bob | 12/1/2005 | 12649.9900 | 1 | | Bob | 12/19/2005 | 265.8500 | 2 | | Tito | 12/22/2005 | 14.9500 | 1 | | Tito | 12/18/2005 | 12.4400 | 2 | | Darren | 1/2/2006 | 620.0000 | 1 | | Bruce | 1/5/2006 | 14.9500 | 1 | | Bruce | 1/4/2006 | 9.9900 | 2 | | Lee Ann | 1/3/2006 | 8.5000 | 1 | | ... |
注重,尽管这些结果非常不错;但是,你却不能在WHERE语句中使用ROW_NUMBER()函数(或任何其它的评价函数)。也就是说,你可能想要说,"把按价格评价第5到第8名的产品列出"。为此,你需要使用一个派生的表或视图。例如,你可以把上面的查询放到一个视图vwPriceRankedProducts中,然后使用如下查询返回第5到第8个排名的产品:
SELECT ProductID,Name,Price,PriceRankFROM vwPriceRankedProductsWHERE PriceRank BETWEEN 5 AND 8 四、 使用RANK和DENSE_RANK处理同级问题
基于可选的partition子句和要求的order by子句,ROW_NUMBER函数默认地递增(加1)每一个返回结果的值。然而,有时你可能想以不同方式处理相同级别,而不是把相同的值赋给相同的级别。例如,前面显示的总订单列表中,Tito在2005年12月22日实现的订单数与Bruce在2006年1月5日实现的订单数相同;然而,ROW_NUMBER函数却把这两行评价为#4和#5,而不是都评价为#4。
RANK和DENSE_RANK函数都能够使用相同的评价计数级。例如,使用下列查询:
SELECT c.Name,o.DateOrdered,tab.TotalOrderAmount, RANK() OVER (ORDER BY TotalOrderAmount DESC) AS BestCustomerFROM vwTotalAmountBilledPerOrder AS tab INNER JOIN Orders AS o ON o.OrderID = tab.OrderID INNER JOIN Customers AS c ON c.CustomerID = o.CustomerID 这个语句将返回如下表所示的结果:
| Name | DateOrdered | TotalOrderAmount | BestCustomer | | Bob | 12/1/2005 | 12649.9900 | 1 | | Darren | 1/2/2006 | 620.0000 | 2 | | Bob | 12/19/2005 | 265.8500 | 3 | | Tito | 12/22/2005 | 14.9500 | 4 | | Bruce | 1/5/2006 | 14.9500 | 5 | | Tito | 12/18/2005 | 12.4400 | 6 | | Bruce | 1/4/2006 | 9.9900 | 7 | | Lee Ann | 1/3/2006 | 8.5000 | 8 | | ... |
注重,具有相同数量的两个订单是怎样都被评价为#4的。RANK和DENSE_RANK之间的不同之处在于,在平级的结果后他们是如何重新开始计数的。RANK绕过尽可能多的平级的结果。在我们上面的示例中,因为有两个结果绑定在#4上,因此跟随其后的#5被跳过而评价等级以#6继续。另一方面,DENSE_RANK从下一个整数继续。假如我们在上面的查询中使用函数名DENSE_RANK代替RANK,那么Tito在2005年12月18日相应于单价$12.44的订单评价将是#5。
|
| 共4页: 上一页 [1] [2] 3 [4] 下一页 |
评论加载中…