搜索
您的当前位置:首页正文

SQLSERVER添加序号列

来源:哗拓教育
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_Feefrom 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 TotalOrderAmountDESC) 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.CustomerIDORDER 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处理同级问题

  基于可选的partition⼦句和要求的order by⼦句,ROW_NUMBER函数默认地递增(加1)每⼀个返回结果的值。然⽽,有时你可能想以不同⽅式处理相同级别,⽽不是把相同的值赋给相同的级别。例如,前⾯显⽰的总订单列表中,RANK和DENSE_RANK函数都能够使⽤相同的评价计数级。例如,使⽤下列查询:

SELECT c.Name,o.DateOrdered,tab.TotalOrderAmount, RANK() OVER (ORDER BY TotalOrderAmount DESC) ASBestCustomerFROM vwTotalAmountBilledPerOrder AS tab INNER JOIN Orders AS o ON o.OrderID = tab.OrderID INNERJOIN 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函数把结果分解成两组、三组或四组等,

因篇幅问题不能全部显示,请点此查看更多更全内容

Top