SQLSERVER添加序号列
select
ROW_NUMBER() OVER(ORDER BY Convey_Fee desc) as z,
rank() OVER(ORDER BY Convey_Fee desc) as z,
DENSE_RANK() OVER(ORDER BY Convey_Fee desc) as z,
NTILE(4) OVER(ORDER BY Convey_Fee desc) as z,
(select sum(1) from Consign_D where Convey_Fee<=a.Convey_Fee) num,
(select sum(1) from Consign_D where Convey_Fee<a.Convey_Fee) num1
,Convey_Fee
from Consign_D a
order by Convey_Fee desc
结果
前4个ROW_NUMBER,RANK,DENSE_RANK和NTILE是SQL 2005新增加的!
后⾯2个是SQL 2000的
SQL Server 2005中引⼊了四个新的评价函数:ROW_NUMBER,RANK,DENSE_RANK和NTILE。尽管这些与SQL Server 2000所提供的函数相⽐是⼀个明显的进步,但是这些函数的使⽤仍然存在⼀些限制(要求使⽤派⽣表或视图来实现功能更为强⼤的应⽤程序)。下⾯让我们分析⼀下每⼀个函数。
这个ROW_NUMBER函数把⼀个序数值赋给每⼀个返回的记录,该序数值依赖于⼀个特定的与这个函数⼀起使⽤的ORDER BY语句。函数ROW_NUMBER的语法是:ROW_NUMBER() OVER([partition] ORDER BY⼦句)。例如,下列查询将返回从最贵的到最便宜的产品,对每⼀种产品按价格进⾏评价:
SELECT ProductID,Name,Price, ROW_NUMBER() OVER(ORDER BY Price DESC) As PriceRankFROM Products
默认情况下,这个ROW_NUMBER函数把⼀个增量值(逐次加1)赋给结果集中的每⼀个记录。借助于可选的partition参数,⽆论何时分区(partitioning)列值发⽣变化,你都可以让ROW_NUMBER函数重新计算⾏数。为了说明这个问题,我使⽤如下查询语法创建了⼀个视图vwTotalAmountBilledPerOrder,它将返回每⼀个OrderID和该订购的总订单数:
SELECT OrderID,SUM(AmountBilled) AS TotalOrderAmountFROM OrderItemsGROUP BY OrderID
这条语句将返回OrderItems表中每⼀个唯⼀的订单,还有相应于该订单的AmountBilled值的和。借助于这个视图,我们可以使⽤ROW_NUMBER⽅法来按最⼤花钱数来评价这些订单,如下所⽰:
SELECT c.Name,o.DateOrdered,tab.TotalOrderAmount, ROW_NUMBER() 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
注意,某些顾客多次出现在这个列表中(如Bob,Tito和Bruce)。也许有时,我们不是想观看以销售量排序的所有订单,⽽更想看到每⼀个顾客的最⾼订单量。为此,我们可以通过使⽤ROW_NUMBER函数中的PARTITION BY⼦句达到这⼀⽬的,如下所⽰:
SELECT c.Name, o.DateOrdered, tab.TotalOrderAmount, ROW_NUMBER() OVER (PARTITION BY c.CustomerID
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
四、使⽤RANK和DENSE_RANK处理同级问题
rank函数的用法
基于可选的partition⼦句和要求的order by⼦句,ROW_NUMBER函数默认地递增(加1)每⼀个返回结果的值。然⽽,有时你可能想以不同⽅式处理相同级别,⽽不是把相同的值赋给相同的级别。例如,前⾯显⽰的总订单列表中,
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
注意,具有相同数量的两个订单是怎样都被评价为#4的。RANK和DENSE_RANK之间的不同之处在于,在平级的结果后他们是如何重新开始计数的。RANK绕过尽可能多的平级的结果。在我们上⾯的⽰例中,因为有两个结果绑定在#4上,因此跟随其后的#5被跳过⽽评价等级以#6继续。另⼀⽅⾯,DENSE_RANK从下⼀个整数继续。如果我们在上⾯的查询中使⽤函数名DENSE_RANK代替RANK,那么Tito在2005年12⽉18⽇相应于单价$12.44的订单评价将是#5。
类似于ROW_NUMBER函数,RANK和DENSE_RANK函数都能使⽤可选的PARTITION BY语句。
SQL Server 2005新引⼊的最后⼀个与T-SQL函数相关的评价函数是NTILE(int)。NTILE象其它的评价函数⼀样操作,但是它能够把结果分成组,每组中相应相同评价结果的记录。你可以使⽤NTILE函数把结果分解成两组、三组或四组等,
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论