WEB开发网
开发学院数据库MSSQL Server T-SQL Enhancement in SQL Server 2005 - Part II... 阅读

T-SQL Enhancement in SQL Server 2005 - Part II

 2008-12-06 10:15:51 来源:WEB开发网   
核心提示: SELECT SalesOrderID,CustomerID,RANK() OVER (ORDER BY CustomerID) AS RowNumFROM Sales.SalesOrderHeader下面是相应的查询结果: 对于RANK(),还有一点需要说明的是,T-SQL Enhanc

SELECT SalesOrderID,CustomerID,RANK() OVER (ORDER BY CustomerID) AS RowNum
FROM Sales.SalesOrderHeader

下面是相应的查询结果:

T-SQL Enhancement in SQL Server 2005 - Part II

对于RANK(),还有一点需要说明的是,它的回返值不是连续的, 比如第五条记录的Row_Num是5而不是2。如果想实现这样需求,就需要用下面一个Function:DENSE_RANK()。

3.     3. DENSE_RANK()

DENSE_RANK()实现了一个连续的Ranking。比如下面的SQL:

SELECT SalesOrderID,CustomerID,DENSE_RANK() OVER (ORDER BY CustomerID) AS RowNum
FROM Sales.SalesOrderHeader

就来产生如下的查询结果:

T-SQL Enhancement in SQL Server 2005 - Part II

4. NTILE()

上面我们说到划分梯队的问题,这样的问题可以通过NTILE() Function来实现。比如我们现在按照CustomerID排序,把CustomerID为1和2的划分到3梯队中:

SELECT SalesOrderID,CustomerID,NTILE(3) OVER (ORDER BY CustomerID) AS RowNum
FROM Sales.SalesOrderHeader
WHERE CustomerID <3

其查询结果为:

T-SQL Enhancement in SQL Server 2005 - Part II

我们可以看到,一共12条记录,划分为3组,平均下来每组4条记录。

5.     5.PARTITION BY

上面提到的所有Ranking都是基于真个结果基的。而有的时候我们需要将真个结果集按照某个Column 进行分组,进行基于组的Ranking。这就需要PARTITION BY了。PARTITION BY置于OVER Clause中,和ORDER BY 平级。

比如下面的SQL将Order记录按照CustomerID进行分组,在每组中输出排名(安OrderDate排序):

SELECT SalesOrderID,CustomerID,RANK() OVER (PARTITION BY CustomerID ORDER BY OrderDate) AS RowNum
FROM Sales.SalesOrderHeader

相应的查询结果:

T-SQL Enhancement in SQL Server 2005 - Part II

上一页  1 2 3 4 

Tags:SQL Enhancement in

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接