Asp.Net教程,WinForm教程,Asp.Net MVC,vs2008教程,vs2010教程,Silverlight技术,源码下载,Asp.Net视频教程
全站热门标签
vs2010 Silverlight 存储过程 水晶报表 ADO.NET JavaScript LINQ AjaxPro DataGridView 面向对象 Extjs GridView XML DevExpress HTML教程 Oracle jQuery 分页 GDI+ Visual C++2010 MySQL Office2010 WPF MVC Dojo WCF4.0 VB.NET Sql2005 textbox cookie WCF WinForm Discuz!NT SQL经典语句 T-SQL checkbox ASPxGridView F# asp.net SQL VS2008新特性 DropDownList Access TreeView Ajax VS2008 页面执行时间 Flex 字符串 回调 VB2005 DataSet C#时间 ASP.NET性能优化 用户在线检测 动画
SQL Server Oracle Access MySQL
当前位置: 主页 > 数据库 > SQL Server >

SQL2005实现排序报表的利器 排序函数RANK()、DENSE_RANK()、NTILE()和ROW_NUMBER()

时间:2010-04-02 21:46来源:未知 作者:admin 点击:

SQLServer 2005 新增了排名函数,一共四个,其中RANK() DENSE_RANK() NTILE()这三个函数是制作带有排名列报表的利器,ROW_NUMBER()函数在分页存储过程中被广泛使用

排名函数有一个明显的共性,就是与over()子句配合使用

与排名函数一起使用的over()子句有两个参数 partition 分组方式 order by 排序方式

RANK()和DENSE_RANK()是一对兄弟,唯一的不同是

当使用RANK()进行排名时 由于order by 参数 的值可能存在相等的情况,比如有两个第一,那么下一个会被排名在第三,即使用RANK()排名时,得到数值并不是连续的(1、1、3),而是用DENSE_RANK()时,得到的永远是连续的(1、1、2).

语法:

RANK ( )    OVER ( [ < partition_by_clause > ] < order_by_clause > )

DENSE_RANK ( )    OVER ( [ < partition_by_clause > ] < order_by_clause > )

 

示例:

USE AdventureWorks;

GO

SELECT i.ProductID, p.Name, i.LocationID, i.Quantity, RANK() OVER (PARTITION BY i.LocationID order by i.Quantity) as RANK

FROM Production.ProductInventory i JOIN Production.Product p

ON i.ProductID = p.ProductID

ORDER BY i.LocationID,RANK

GO

USE AdventureWorks;

GO

SELECT  i.ProductID, p.Name, i.LocationID, i.Quantity, DENSE_RANK() OVER (PARTITION BY i.LocationID order by i.Quantity) as DENSE_RANK

FROM Production.ProductInventory i JOIN Production.Product p ON i.ProductID = p.ProductID

ORDER BY i.LocationID,DENSE_RANK;

GO

结果:


NTILE() 我的理解是将结果集按片分割,SQLServer帮助里写的是存储桶。
语法:
NTILE (integer_expression)    OVER ( [ <partition_by_clause> ] < order_by_clause > )
 
与其他排名函数不同 NTILE()多了一个参数integer_expression,这个参数是一个正整数,数据类型支持bigint. integer_expression参数决定了结果集最终分成几片,或者是分布到几个桶中.
例如integer_expression参数为5,如果结果集的行数为50,正好能够整除,那么这50行数据会被分成5片,每片10行数据;如果不能够整除,结果集是53行数据,那么第一、二、三片,每片11行数据,其余10行数据.
 
示例:
USE AdventureWorks;
GO
SELECT c.FirstName, c.LastName, NTILE(5) OVER(ORDER BY SalesYTD DESC) AS 'Quartile', s.SalesYTD, a.PostalCode
From Sales.SalesPerson s JOIN Person.Contact c on s.SalesPersonID = c.ContactID
JOIN Person.Address a ON a.AddressID = c.ContactID
WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0;
GO
结果:
 

ROW_NUMBER()函数用来生成数据行在结果集中的序号
语法:
ROW_NUMBER ( )     OVER ( [ <partition_by_clause> ] <order_by_clause> )
示例:
USE AdventureWorks
GO
SELECT c.FirstName, c.LastName, ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS 'Row Number', s.SalesYTD, a.PostalCode
FROM Sales.SalesPerson s JOIN Person.Contact c on s.SalesPersonID = c.ContactID
JOIN Person.Address a ON a.AddressID = c.ContactID
WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0
--以下示例将返回行号为50 到60(含)的行,并以OrderDate 排序。
--这在分页时非常实用
--关于WITH语法应查阅CTE相关内容
USE AdventureWorks;
GO
WITH OrderedOrders AS
(SELECT SalesOrderID, OrderDate,
ROW_NUMBER() OVER (order by OrderDate)as RowNumber
FROM Sales.SalesOrderHeader )
SELECT *
FROM OrderedOrders
WHERE RowNumber between 50 and 60;
结果:
 
(责任编辑:admin)
Tags:排序函数
责任编辑:admin
返回顶部
------分隔线----------------------------
推荐内容
骆驼户外男 真皮磨砂日常休闲鞋 低帮 2011秋冬新款 专柜正品特价 骆驼户外男 真皮磨砂日常休闲鞋 低帮 2011秋冬新款 专柜正品特价
  • 数据库中自定义拆分字符串函数Split()

    经常我们要用到批量操作时都会用到字符串的拆分,郁闷的是SQL Server中却没有自带Split函数,所以我们只能自己动手来解决一下。为了减少和数据库的通讯次数...

  • sql函数实现三种父子递归

    在实际运用中经常会创建这样的结构表Category(Id, ParentId, Name),特别是用于树形结构时(菜单树,权限树..),这种表设计自然而然地会用...

  • SQL CASE WHEN使用

    Case具有两种格式。简单Case函数和Case搜索函数。 --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THE...

  • MSSQL移除字符串两边的指定字符

    移除字符串左边的字符: CREATE FUNCTION [ dbo ] . [ RemoveLeftChar ] ( @Expression varchar (...

  • IDENTITY的小技巧--SQL Server 2005

    备份数据库遇到一个问题,就是将旧数据搬移到新主机数据表的时候,如果主键是的 IDENTITY 是设定自动增加的话,那么旧有的主键数据,在新数据表上面就好像是重新...

  • Sql2005将相同值的行内容进行合并

    如何将相同键值的蓝位内容值串接 ? 举例来说 TableA 如下: ID Type DESC 1 cpu 处理器 1 cpu 双核心 1 cpu 800外频 2...

  • SQL Server数据库恢复案例分享

    很多数据恢复工程师包括一些数据恢复技术爱好者经常会问同样一个问题:数据一旦被覆盖了,还能不能恢复呀?我听说国外能恢复被覆盖以后的数据,据说只要是覆盖操作在7次以...

  • SQL2005索引优化

    SQL2005索引优化...

  • 容易忽略的SQL语句

    容易忽略的SQL语句...

  • 世界完全对称日(SQL)

    世界完全对称日(SQL)...

  • 经典的sql语句技巧

    1、应用程序中,保证在实现功能的基础上,尽量减少对数据库的访问次数;通过 搜索参数,尽量减少对表的访问行数,最小化结果集,从而减轻网络负担;能够分 开的操作尽量...

  • provider:SQL网络接口, error: 26-定位指定的服务器/实例时出错

    在建立与服务器的连接时出错。在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败。 (prov...

  • 树形数据汇总查询(MS-SQL Server应用实例)

    -- SQL2000: -- 查询的数据语句: SELECT DISTINCT B.KJND,B.GSDM,A.FZDM,A.FZMC, ZBZE1 = SUM...

  • SQLServer批量备份与还原

    备份与还原是数据库避不开的主题,而作为DBA,经常会面临将一台机器上的所有数据库重新构建到一台新机器上的要求; 在现在都讲究自动化管理的时代,传统的界面操作备份...

  • 如何修改SQL Server 2005服务器名称

    1、使用SELECT @@ServerName可以看到当前数据库的服务器名 2、SELECT * FROM Sys.SysServers表中可以看到当前的所有服...