`

求每组前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种,不知道大家还有什么其他好方法,可以交流,谢谢。

分享到:
评论

相关推荐

    MS SQL 2000利用数据库复制技术 实现数据同步更新

    MS SQL 2000 的数据库复制技术是一种用于在不同服务器之间同步和分发数据的方法,确保数据的一致性。复制技术在多种场景下都非常有用,例如在局域网、拨号连接或互联网上分发数据给远程或移动用户,提高应用程序性能...

    罗斯文数据库 for ms sql

    每个表都有一个唯一的名称,由多个字段组成,每个字段定义了一种特定的数据类型。例如,"Customers"表可能包含"CustomerID"、"CompanyName"和"ContactName"等字段。 4. **关系**:在罗斯文数据库中,数据通常不是...

    MS SQL SERVER安全之初探.pdf

    MS SQL SERVER 提供了三种安全模式:Standard Security (标准安全模式)、Integrated Security (集成安全模式) 和 Mixed Security (混合安全模式)。Standard Security 模式需要用户有 SQL SERVER 上的 Logi n ID 和...

    MS-SQL 锁机制

    锁可以根据其用途和行为分为几种不同的类型: 1. **共享锁**:当一个用户需要读取数据时,MS-SQL Server会自动为该数据分配共享锁。这种锁可以允许多个用户同时读取数据,但在数据被锁定期间不允许任何用户对其进行...

    MS SQL Server7系统表

    2. **数据库系统表**:每个数据库都有一组自己的系统表,如sysobjects、syscolumns和sysindexes,它们记录了数据库中的对象(如表、视图、索引)的详细信息。 3. **动态管理视图(DMV)**:虽然不是传统意义上的...

    ms sql server 自动备份设置工具

    总之,"ms sql server 自动备份设置工具"为企业提供了一种便捷的方式,来管理和执行SQL Server的自动备份策略,确保数据安全无虞。通过理解备份类型、配置合适的备份计划、设定备份目标以及监控备份过程,用户可以...

    SQL Server 将某一列的值拼接成字符串.docx

    这个过程可以通过几种不同的方法来实现,其中包括使用FOR XML PATH子句和CONCAT函数。我们将深入探讨这些方法,并结合提供的示例进行解释。 首先,`FOR XML PATH('')` 是SQL Server中用于生成XML的一种方式,但在...

    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语句的...

    SQLIO磁盘压力分析

    4. **性能指标**:SQLIO输出的结果包括每秒I/O次数(IOPS)、吞吐量(MB/s)以及延迟(ms),这些指标有助于分析磁盘性能瓶颈,比如磁盘响应速度慢、I/O吞吐量低等。 5. **解读结果**:理解SQLIO的输出报告是关键,...

    Microsoft SQL Server 2005 Express Edition SP3

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

    VC_中连接Oracle数据库的几种方法

    ### VC_中连接Oracle数据库的几种方法 #### 引言 随着信息技术的不断发展,数据库管理系统在各类信息系统中的地位越来越重要。Oracle数据库作为一种广泛使用的数据库系统,以其强大的功能、优秀的性能及高安全性...

    SQLServer索引调优实践

    为了进一步优化查询性能,可以考虑以下几种方法: 1. **更改聚簇索引**:基于查询模式,重新评估并选择更合适的字段作为聚簇索引。例如,如果`Data1`和`DTAt`是常用的查询条件,可以考虑将这两个字段作为组合聚簇...

    程序员的SQL金典6-8

    - **MS SQL Server 2000**:使用`TOP`关键字。 - **MS SQL Server 2005**:使用`OFFSET`和`FETCH NEXT`。 - **Oracle**:使用`ROWNUM`。 - **DB2**:使用`FETCH FIRST`。 **4.5 抑制数据重复** - 使用`DISTINCT`...

    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和后台进程,这种启动...

    ASP_NET导出Excel数据方法总结

    本篇文章将深入探讨几种在ASP.NET环境中导出Excel数据的方法,包括它们的工作原理、优缺点以及适用场景。 #### 方法一:引用COM组件 这种方法通过直接调用Excel COM组件,将数据从DataTable导入至Excel单元格,并...

    实现SQL中JOIN联接多个表查询.doc

    首先,JOIN操作主要有几种类型,包括INNER JOIN、LEFT JOIN (或 LEFT OUTER JOIN)、RIGHT JOIN (或 RIGHT OUTER JOIN)以及FULL JOIN (或 FULL OUTER JOIN)。在描述中提到的"inner join"是指INNER JOIN,这是最常见的...

    关于SQL-Serer数据库安全的研究.docx

    对于 MS SQL SERVER,它能提供较为完善的审计功能,用来监视各用户对数据库施加的动作。 数据库加密是指将数据用密文形式存储或传输的手段保证高敏感数据的安全,这样可以防止那些企图通过不正常途径存取数据的行为...

Global site tag (gtag.js) - Google Analytics