?
快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

正宗长沙麻将免费下载:银河唯一官网1331:探讨SQL Server 2005的评价函数评价函数

?

长沙转转麻将必胜口诀 www.fv7j.com.cn 一、 简介

在2005年11月份,微软发行了三种新产品系列:Visual Studio 2005,SQL Server 2005和.NET框架2.0(它包括ASP.NET 2.0)。SQL Server 2005是微软自从其上一个主要发行版本SQL Server 2000以来最新版本的数据库平台。在以前五年的成长中,SQL Server中加入了大年夜量的新特性,所有这些新内容都被总结到微软网站的一篇文章《What's New in SQL Server 2005?》中。应用SQL Server 2005作为后端数据库构建基于web利用法度榜样的开拓者很可能会对这些新特性抱有浓厚的兴趣,这些新特性包括新的T-SQL改进,更好的Visual Studio集成,与CLR/.NET框架的集成,以及SQL Server 2005 Management Studio利用法度榜样(它是SQL Server 2000的企业治理器的一个更为"平滑"的版本)。

与曩昔的SQL Server 2000比拟, 2005中的T-SQL改进使得编写某些类型的查询极为轻易。在SQL Server 2005中,T-SQL语法更为精练、可读和易于理解。

在本文中,我们将专门探究SQL Server 2005的评价函数,它们大年夜大年夜简化了对查询结果进行评价的历程。

二、 数据模型和评价结果根基

在我们阐发若何应用通俗查询模式之前,让我们起开创建一个能够运行这些查询的数据模型。在本文中,我应用SQL Server 2005 Express版原先实现我的演示,并且包括了一个数据库和一个ASP.NET 2.0网站(请参考本文响应的完备源码。就象Visual Studio一样,SQL Server发行中也一同加杂了其它一些不合的版本。此中,Express版本是一个针对业余喜欢者、门生等群体的免费版本。假如你下载和安装Visual Web Developer(Visual Studio针对web开拓者的Express版本),那么你可以选择一同安装SQL Server 2005 Express版本)。

对付本文中的示例,我们将应用一个含有产品、贩卖职员(雇员)、顾客和订单信息的数据库。我们应用五个表来建模:Customers,Employees,Products,Orders和OrderItems。此中,Customers,Employees和Products表分手包孕每一个顾客,雇员和产品信息的行记录数据。每当一个顾客进行购买活动,一条新记录被添加到Orders表中,此中的信息唆使该顾客实现了购买、该雇员进行的这一贩卖活动及订单的日期。此中,OrderItems映射订单中的每一件产品,产品的数量和价格总值(假定较大年夜的购买量可以打折)。下图展示了这银河唯一官网1331些表(及字段)以及它们之间的关系。

如图所展示的,这个OrderItems在Orders和Products表之间建立一个对多对的连接。

当构建申报或阐发数据时,用户或治理员常常盼望看到以某种要领对数据的评价信息。例如,你的老板可能想要一个申报来显示卖路最好的前十项,或在第三个季度贩卖部中实现最大年夜收入的前三名贩卖职员。更繁杂的环境可能是仅返回第3到第5个评价排名的贩卖职员。在SQL Server 2000中,返回最高排名项的查询可以经由过程应用TOP或ROWCOUNT关键字来实现。为了检索一个特定评价子集,你必要应用一种"派生表"(或者是一种基于视图的手段)。

SQL Server 2005中引入了四个新的评价函数:ROW_NUMBER,RANK,DENSE_RANK和NTILE。只管这银河唯一官网1331些与SQL Server 2000所供给的函数比拟是一个显着的进步,然则这些函数的应用仍旧存在一些限定(要求应用派生表或视图来实现功能更为强大年夜的利用法度榜样)。下面让我们阐发一下每一个函数。

三、 应用ROW_NUMBER函数谋略行数

这个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

这个语句的履行结果如下表所示:

ProductID

Name

Price

PriceRank

8

Desk

495.0000

1

10

Executi银河唯一官网1331ve Chair

295.0000

2

9

Chair

125.0000

3

5

Mouse

14.9500

4

6

Mousepad

9.9900

5

11

Scissors

8.5000

6

4

Stapler

7.9500

7

3

Binder

1.9500

8

...

默认环境下,这个ROW_NUMBER函数把一个增量值(逐次加1)赋给结果集中的每一个记录。借助于可选的partition参数,无论何时分区(partitioning)列值发生变更,你都可以让ROW_NUMBER函数从新谋略行数。为了阐明这个问题,我应用如下查询语法创建了一个视图vwTotalAmountBilledPerOrder,它将返回每一个OrderID和该订购的总订单数:

ProductID

Name

Price

PriceRank

8

Desk

495.0000

1

10

Executive Chair

295.0000

2

9

Chair

125.0000

3

5

Mouse

14.9500

4

6

Mousepad

9.9900

5

11

Scissors

8.5000

6

4

Stapler

7.9500

7

3

Binder

1.9500

8

...

留意,某些顾客多次呈现在这个列表中(如Bob,Tito和Bruce)。大概无意偶尔,我们不是想不雅看以贩卖量排序的所有订单,而更想看到每一个顾客的最高订单量。为此,我们可以经由过程应用ROW_NUMBER函数中的PARTITION BY子句达到这一目的,如下所示:

SELECT c.Name, o.DateOrdered, tab.TotalOrderAmount, ROW_NUMBER() OVER (P银河唯一官网1331ARTITION 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

这个语句将返回如下表所示的结果:

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

...

留意,只管这些结果异常不错;然则,你却不能在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

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

...

留意,具有相同数量的两个订单是如何都被评价为#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语句。

五、 应用NTILE函数对评价结果进行分组

SQL Server 2005新引入的着末一个与T-SQL函数相关的评价函数是NTILE(int)。NTILE象其它的评价函数一样操作,然则它能够把结果分成组,每组中响应相同评价结果的记录。你可以应用NTILE函数把结果分化成两组、三组或四组等,如下例所示:

SELECT ProductID,Name,Price,NTILE(4) OVER (ORDER BY Price DESC) as QuartileFROM Produts

这个语句将返回如下表所示的结果:

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

...

在随本文下载的演示法度榜样中,我供给了一个例子,它应用了一个具有NTILE函数的视图来容许用户有选择地查看各类分组的最大年夜订单量。

六、 结论

在本文中,我们探究了SQL Server 2005中的四个新函数的用法。这四个新函数分手是:ROW_NUMBER,RANK,DENSE_RANK和NTILE。与SQL Server 2000应用的旧技巧比拟,它们使得返回评价结果更为轻易。然而,这些函数仅仅是SQL Server 2005中所供给的新的T银河唯一官网1331-SQL特性中的极少的一部分。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: