`

求每组前2名,你有几种方法?(MS SQL2000)

Go 
阅读更多

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种方法类似,大家可以自己试试

我共写了4种,不知道大家还有什么其他好方法,可以交流,谢谢。

分享到:
评论

相关推荐

    2009 年度十大 SQL Server 技巧文章

    在对SQL Server系统执行入侵测试或者更高级别的安全审计时,有一种测试不应该被忽略,那就是SQL Server密码测试。这一点看起来显而易见,但是很多人都会忽略它。  SQL Server密码破解工具简介 使用XML在SQL ...

    Log Explorer for SQL Server v4.22 含注册机

    支持 MS SQL 2005 之前的版本 不支持 sql 2008 介绍 Log Explorer主要用于对MSSQLServer的事物分析和数据恢复。你可以浏览日志、导出数据、恢复被修改或者删除的数据(包括执行过update,delete,drop和truncate语句的...

    Microsoft SQL Server 2005 Express Edition SP3

    为了避免出现此类问题,您必须在安装有 SQL Server Express 的服务器中完全启用 MS DTC 服务。 若要完全启用 MS DTC,请执行下列操作: 在“控制面板”中,打开“管理工具”,再双击“组件服务”。 在左窗格的...

    net学习笔记及其他代码应用

    10.求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m [Page] 答: int Num = this.TextBox1.Text.ToString() ; int Sum = 0 ; for (int i = 0 ; i ; i++) { if((i%2) == 1) { Sum += i ; ...

    orcale常用命令

    Oracle数据库有哪几种启动方式 说明: 有以下几种启动方式: 1、startup nomount 非安装启动,这种方式启动下可执行:重建控制文件、重建数据库 读取init.ora文件,启动instance,即启动SGA和后台进程,这种启动...

    超级有影响力霸气的Java面试题大全文档

    round方法返回与参数最接近的长整数,参数加1/2后求其floor. 30、String s = new String("xyz");创建了几个String Object? 两个 31、EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的? ...

    asp.net知识库

    通过反射调用類的方法,屬性,字段,索引器(2種方法) ASP.NET: State Server Gems 完整的动态加载/卸载程序集的解决方案 从NUnit中理解.NET自定义属性的应用(转载) 如何在.NET中实现脚本引擎 (CodeDom篇) .NET的插件...

    java 面试题 总结

    round方法返回与参数最接近的长整数,参数加1/2后求其floor. 27、String s = new String("xyz");创建了几个String Object? 两个 28、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序...

    最全的oracle常用命令大全.txt

    Oracle数据库有哪几种启动方式 说明: 有以下几种启动方式: 1、startup nomount 非安装启动,这种方式启动下可执行:重建控制文件、重建数据库 读取init.ora文件,启动instance,即启动SGA和后台进程,这种启动...

    数据库实验6数据库系统设计.doc

    091 "姓名 " "学号 " "实验组" " "实验时间 "2012-6-1 "指导教师" "成绩 " " "实验项目名称"实验六:数据库系统设计 " "实" " "验"要求掌握数据库设计的基本技术,熟悉数据库设计的每个步骤中的任务和实施方法, " ...

    网管教程 从入门到精通软件篇.txt

    Windows XP(包括 Windows 2000)的控制台命令是在系统出现一些意外情况下的一种非常有效的诊断和测试以及恢复系统功能的工具。小编的确一直都想把这方面的命令做个总结,这次辛苦老范给我们整理了这份实用的秘笈。 ...

    测试培训教材

    执行安装前请先确保你的系统已经安装了Office Excel软件。 2.安装成功后,打开编制好的文件,选中所有要导入的需求记录,注意:只选数据. Export To Quality 3.点击“工具” Center 4.输入QC的URL地址 5.输入项目...

    vc++ 开发实例源码包

    该实例可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本实现了上述功能,而且网速一般有几M/S。另外有只打开一个应用程序、CRichEdit的使用、最小到...

    计算机应用基础C卷.doc

    Adobe Photoshop Linux MS SQL Server MS Windows 关于Windows 7 的"任务栏",以下描述正确的是______。 显示系统的所有功能 只显示正在后台工作的程序窗口 只显示当前活动程序窗口名 便于实现程序窗口之间的切换 ...

    构建安全的 ASP.NET 应用程序(中文译作+英文原作)

    然而,我们建议您先阅读本指南的前几章(第 1 章到第 4 章),即第 I 部分,因为这些章节可帮助您了解安全模型并可帮助您自行确定核心技术和安全服务。应用程序架构设计师一定要阅读第 3 章,这一章提供了一些有关跨...

    java开源包2

    Chronicle 是一个超低延迟、高吞吐、持久化的消息和事件驱动的内存数据库,延迟只有16纳秒以及支持每秒钟 500-2000 万消息/记录。 google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 ...

    清正-专业网络考试系统

    功能强大的 MS SQL Server题库支持,使您可以实现多种方式组卷。 清正-专业网络考试系统支持多媒体试卷,用户可以在试卷中插入声音、图画、影片等文件,让您的试卷活起来、动起来。可以采用3种方式自由组卷(自动...

    vc++ 应用源码包_6

    一共10几包,每个包几十兆。 Visual.C++编程技巧精选500例源代码 内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、...

    vc++ 应用源码包_5

    一共10几包,每个包几十兆。 Visual.C++编程技巧精选500例源代码 内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、...

Global site tag (gtag.js) - Google Analytics