EKing 十八画生

--》》》 君不见黄河之水天上来,奔流到海不复回...

用户操作
[即时聊天] [发私信] [加为好友]
EKing/王毅ID:wangyihust
287584次访问,排名202好友2人,关注者32
hot
wangyihust的文章
原创 237 篇
翻译 1 篇
转载 82 篇
评论 152 篇
EKing/王毅的公告
王毅 is online?
MSN:wangyihust
   @hotmail.com
巨蟹座
毕业学校: HUST
SCUT
目前位置:中国西安
最近评论
s:美女啊
wowlevel:http://www.wowlevel.net/index.asp
power level
wangyihust:博达的建站系统VSB不知道运用在实际项目中如何?好像要硬加密狗。
EKING:EKING.
csnffdn:是西安 热工院的 王毅吗?
文章分类
收藏
相册
Develop
TEMP
DOTNET
Ajax官方主页
ASP.NET官方网站
C#开源资源大全
Dflying Atlas
dotnetjunkies
Good Ajax Samples
gotdotnet开发网
JSON格式化工具
Kaneboy's Blog
MS.Tech
MSDN
MSDN杂志
scottgu
Win32 Api在DotNet下的封装
天极网微软开发专栏
老猫的理想
JAVA
bea开发文档
CSDN
IBM Developers中国
JavaEye
TSS
WEB开发荟萃
Wiki
中国Linux公社
电力网络
中国电力社区(炉火纯青)
华能集团
电力世界网
粤电集团
西安热工院
锅炉论坛
个人事务
电子报
个人简历
我的相册
IT公司速查手册
Norton病毒库定时更新
万年历
中国代理列表
西安市公交线路
西安电子地图
学术研究
EI Village Indexed
IEEE/IEE
中国ERP知识库
数据挖掘研究院
存档
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

转载 每个分类取最新的几条的SQL实现收藏

新一篇: 解决打开CHM格式文件出现“网页不能浏览”错误的方法 | 旧一篇: Silverlight2.0: 在一个aspx文件中选择显示不同的的xaml

     分类统计时候,我们可能经常会碰到这样的需求,每个分类按照一定顺序,取几条数据,然后在一起显示。

    这个问题的解决方法,我们通过搜索引擎,可以找到很多中。但是不是SQL语句过于复杂,就是在数据量比较大时候,性能特别成问题。

     今天我就碰到这样一个需求。而我自己的解决方案就是SQL过于复杂,或者性能比较差的。为此我在CSDN论坛发了个帖子,看有没有更好的解决方案。

http://topic.csdn.net/u/20080504/14/5c5866c3-8b91-45ef-ab17-f994f88f8e42.html

CSDN的 SQL Server 板块  不愧是高手云集,问题发出不到半小时,就获得了近10种解决方案。经过测试,我把性能最高,且SQL不复杂的方案整理出来。特别感谢 jinjazz 的解答。

 

问题详细描述如下:

比如,假设我们有下面这样结构的一张表,这张表的数据量非常巨大。

CREATE TABLE table1
(
[ID] [bigint] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](128) NOT NULL,
[class] int not null,
[date] datetime not null
)

class 表示分类编号。 分类数不固定, 至少有上千种分类
date 表示该条记录被更新的时间
我们现在想获得每个分类最新被更新的5条记录。

 

解决方案

select id,name,class,date from(
select id,name,class,date ,row_number() over(partition by class order by date desc)
as rowindex from table1) a
where rowindex <= 5

 

解决方案简单说明:

这个解决方案的关键就是使用了SQL 2005 的 ROW_NUMBER 这个全新的函数。

ROW_NUMBER ( ) 函数的语法如下:
ROW_NUMBER ( )     OVER ( [ <partition_by_clause> ] <order_by_clause> )

OVER 子句中的 PARTITION BY 将结果集分为多个分区。
OVER 子句中的 ORDER BY 将对 ROW_NUMBER 进行排序。

下面是MSDN的几个简单例子:

 

以下示例将根据年初至今的销售额,返回 AdventureWorks 中销售人员的 ROW_NUMBER。

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 INNER JOIN Person.Contact c ON s.SalesPersonID = c.ContactID
INNER JOIN Person.Address a ON a.AddressID = c.ContactID
WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0;


以下示例将返回行号为 50 到 60 的行(包含这两行),并按 OrderDate 进行排序。

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;


 

以下示例说明了如何使用 PARTITION BY 参数。

USE AdventureWorks; 
GO

SELECT c.FirstName, c.LastName ,
ROW_NUMBER() OVER (PARTITION BY PostalCode ORDER BY SalesYTD DESC) AS 'Row Number' ,
s.SalesYTD, a.PostalCode

FROM Sales.SalesPerson s INNER JOIN Person.Contact c ON s.SalesPersonID = c.ContactID
INNER JOIN Person.Address a ON a.AddressID = c.ContactID
WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0;
转自:http://blog.joycode.com/ghj/archive/2008/05/04/115104.aspx

发表于 @ 2008年05月23日 17:07:10|评论(loading...)|编辑

新一篇: 解决打开CHM格式文件出现“网页不能浏览”错误的方法 | 旧一篇: Silverlight2.0: 在一个aspx文件中选择显示不同的的xaml

评论:没有评论。

发表评论  


登录
Csdn Blog version 3.1a
Copyright © EKing/王毅