在SQL Server2005/2008中对记录进行分组,并获得每组前N条记录

本文为原创,如需转载,请注明作者和出处,谢谢!

    假设有一个表,SQL语句如下:
CREATE TABLE [dbo].[scan](
    
[km] [int] NULL,
    
[kh] [int] NULL,
    
[cj] [int] NULL
ON [PRIMARY]

    其中km为科目号、kh为考生号、cj为成绩,现对km和kh进行分组,并获得每组前2条记录(按cj从高到低排序)。基本思想是为每组加一个序号列,再用where取序号小于等于2的。SQL语句如下:
select * from 
(
    
select a.km,a.kh,cj,row_number() over(partition by a.km order by a.km,a.cj desc) n
    
from 
        (
select km,kh,SUM(cj) cj from scan group by km,kh) a 
) b 
where n<=2 order by km, cj desc

最后得到的结果集如下图所示。
Tag标签: sqlserver,分组
1
1
(请您对文章做出评价)
« 上一篇:android版多功能日历,欢迎大家测试
» 下一篇:GPhone、OPhone、UPhone、APhone、IPhone:满城尽带XPhone

posted on 2009-11-03 08:41 银河使者 阅读(1964) 评论(7)  编辑 收藏 网摘 所属分类: 原创, SQL Server

评论

#1楼 2009-11-03 09:00 高海东      

性能怎么样呢   回复  引用  查看    

#2楼 2009-11-03 09:04 金色海洋(jyk)      

“找找看”了一下:

http://www.cnblogs.com/netfish/archive/2005/12/26/304668.html

select *
from t as a
where id in(select top 2 id from t where rid=a.rid order by id)

  回复  引用  查看    

#3楼 2009-11-03 09:53 荒芜的世界      

from
(select km,kh,SUM(cj) cj from scan group by km,kh) a
是多余的

select *
from (
select *,n=row_number() over (partition by km,kh order by cj)
from scan) t
where n<=2
就行了
  回复  引用  查看    

#4楼 2009-11-03 11:09 锦瑟[未注册用户]

怎么这样的贴也可以上首页,你用rownumber比以前不用还要写的繁琐。一个in或者exist+having就可以解决了……   回复  引用    

#5楼 2009-11-03 17:49 这话说的^_^[未注册用户]

本文为原创,如需转载,请注明作者和出处,谢谢!   回复  引用    

#6楼 2009-11-03 20:23 yzlhccdec      

恩,我也是这么写的。。。1年前。。。   回复  引用  查看    

#7楼 2009-12-13 20:50 好俊的功夫啊      

建议:下次直接用真实数据更直观,不用测试数据123,abcd等   回复  引用  查看    

<2009年11月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

导航

统计

公告

我的其他Blog

http://nokiaguy.blogjava.net
http://blog.csdn.net/nokiaguy

正在读的书




搜索

 

常用链接

我参与的团队

我的标签

随笔分类(174)

随笔档案(89)

相册

Blogs

开源

协议

积分与排名

最新评论

阅读排行榜

评论排行榜