求每组前2名,你有几种方法?(sql server2000+sql server2005)

create table abc(
 i nvarchar(10),
 ii int,
 iii int,
 iiii int,
 price money)
go
insert into abc
 select 'b',1,2,1,11
 union all
 select 'b',211,2,1,211
 union all
 select 'a',21,2,1,311
 union all
 select 'd',41,42,1,411
 union all
 select 'd',41,42,1,511
 union all
 select 'd',41,42,1,611
 union all
 select 'e',1,2,1,11
 union all
 select 'e',71,2,1,31
 union all
 select 'e',61,2,1,911
 union all
 select 'e',771,2,1,1
go

要求的结果是:
以i分组,求每组price最大的前2条记录

i          ii          iii         iiii        price                 
---------- ----------- ----------- ----------- --------------------- 
a          21          2           1           311.0000
b          1           2           1           11.0000
b          211         2           1           211.0000
d          41          42          1           511.0000
d          41          42          1           611.0000
e          71          2           1           31.0000
e          61          2           1           911.0000

 

1.
select *
from abc a
where (
 select count(*) from abc b
  where a.i=b.i and b.price>a.price)<2
order by i,price

连接查询,判断数量


2.
select i,ii,iii,iiii,price 
from (
select (select isnull(sum(1),0)+1  from abc b where a.i=b.i and a.price<b.price) ids,*
from abc a) tem
where ids<3
order by i,price

生产一个内部表,给内部表tem中的每一组排序,并把排序号放入新列ids中


3.
declare @looptime int
declare @count int
declare @i nvarchar(10)
/*定义表变量@abc,和表ABC中的所有列类型相同*/
declare @abc table(
 i nvarchar(10),
 ii int,
 iii int,
 iiii int,
 price money)
declare @tem table(
 ids int identity,
 class nvarchar(10))
/*把表ABC中的所有组全部查询出来,暂时存在表变量@tem中*/
insert into  @tem(class) 
 select i
  from abc
  group by i
/*求出表变量@tem中行数量*/
select @count=@@rowcount
/*循环变量@looptime赋初值=1*/
select @looptime=1
while(@looptime<=@count)
begin
 /*将每组名赋值到变量@i*/
 select @i=class
  from @tem 
  where ids=@looptime  
 /*将每组前2名插入到表变量@abc中*/
 insert into @abc
  select top 2 *
   from abc
   where i=@i
   order by price desc
 /*循环变量@looptime累加1*/
 select @looptime=@looptime+1
end
/*显示结果*/
select * 
 from @abc 
 order by i,price


4.
用游标来处理
方法和我的第3种方法类似,大家可以自己试试

 

5.利用sql server2005排名函数
SELECT  *
FROM    ( SELECT    i ,
                    ii ,
                    iii ,
                    iiii ,
                    price ,
                    de = ROW_NUMBER() OVER ( PARTITION BY i ORDER BY [price] DESC )
          FROM      abc
        ) AS bb
WHERE   de <= 2


我共写了5种,1到4都可以在sql2000下运行,5必须在sql2005运行

不知道大家还有什么其他好方法,可以交流,谢谢。

我的系列文章
A. Sql Server2005 Transact-SQL 新兵器学习 
B. MCAD学习 
C. 代码阅读总结 
D. ASP.NET状态管理 
E. DB(数据库) 
F. WAP 
G. WinForm 
H. Flex

我的好文推荐
FlexAir开源版-全球免费多人视频聊天室,免费网络远程多人视频会议系统((Flex,Fms3联合开发))<视频聊天,会议开发实例8> 
Sql Server2005 Transact-SQL 新兵器学习总结之-总结 
MS SQL数据库备份和恢复存储过程(加强版本) 
sql server中分布式查询随笔(链接服务器(sp_addlinkedserver)和远程登录映射(sp_addlinkedsrvlogin)使用小总结) 
ASP.NET2.0国际化/本地化应用程序的实现总结(多语言,多文化页面的实现) 
WAP开发资料站(最新更新) 
自定义格式字符串随笔 (IFormattable,IFormatProvider,ICustomFormatter三接口的实现) 
Mcad学习笔记之异步编程(AsyncCallback 委托,IAsyncResult接口,BeginInvoke方法,EndInvoke方法的使用小总结) 
Mcad学习笔记之通过反射调用類的方法,屬性,字段,索引器(2種方法) 
Mcad学习笔记之序列化(2进制和Soap序列 化) 
Mcad学习笔记之委托再理解(delegate的构造器,BeginInvoke,EndInvoke,Invoke4个方法的探讨) 
ASP.NET状态管理之一(概括篇) 
Flex,Fms学习笔记




本文转自aierong博客园博客,原文链接:http://www.cnblogs.com/aierong/archive/2004/08/23/35844.html,如需转载请自行联系原作者

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值