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

本文介绍了一种SQL技巧,通过使用分组和窗口函数row_number()实现对数据的特定排序与筛选。具体展示了如何获取分组后每组中按成绩从高到低排序的前两条记录。

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

假设有一个表,SQL语句如下:

<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 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语句如下:

<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 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


最后得到的结果集如下图所示。




国内最棒的Google Android技术社区(eoeandroid),欢迎访问!

《银河系列原创教程》 发布

《Java Web开发速学宝典》 出版,欢迎定购

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值