`
kavy
  • 浏览: 890717 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

SQL 按某一字段分组取最大(小)值所在行的数据

 
阅读更多
--按某一字段分组最大(小)值所在行的数据
--
(爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开) 2007-10-23于浙江杭州)
/*

数据如下:
name val memo
a    2   a2(a的第二个值)
a    1   a1--a的第一个值
a    3   a3:a的第三个值
b    1   b1--b的第一个值
b    3   b3:b的第三个值
b    2   b2b2b2b2
b    4   b4b4
b    5   b5b5b5b5b5
*/
--创建表并插入数据:
create table tb(name varchar(10),val int,memo varchar(20))
insert into tb values('a',    2,   'a2(a的第二个值)')
insert into tb values('a',    1,   'a1--a的第一个值')
insert into tb values('a',    3,   'a3:a的第三个值')
insert into tb values('b',    1,   'b1--b的第一个值')
insert into tb values('b',    3,   'b3:b的第三个值')
insert into tb values('b',    2,   'b2b2b2b2')
insert into tb values('b',    4,   'b4b4')
insert into tb values('b',    5,   'b5b5b5b5b5')
go

--一、按name分组val最大的值所在行的数据。
--
方法1:
select a.* from tb a where val = (select max(val) from tb where name = a.name) order by a.name
--方法2:
select a.* from tb a where not exists(select 1 from tb where name = a.name and val > a.val)
--方法3:
select a.* from tb a,(select name,max(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name
--方法4:
select a.* from tb a inner join (select name , max(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name
--方法5
select a.* from tb a where 1 > (select count(*from tb where name = a.name and val > a.val ) order by a.name
/*
name       val         memo                 
---------- ----------- -------------------- 
a          3           a3:a的第三个值
b          5           b5b5b5b5b5
*/

--二、按name分组val最小的值所在行的数据。
--
方法1:
select a.* from tb a where val = (select min(val) from tb where name = a.name) order by a.name
--方法2:
select a.* from tb a where not exists(select 1 from tb where name = a.name and val < a.val)
--方法3:
select a.* from tb a,(select name,min(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name
--方法4:
select a.* from tb a inner join (select name , min(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name
--方法5
select a.* from tb a where 1 > (select count(*from tb where name = a.name and val < a.val) order by a.name
/*
name       val         memo                 
---------- ----------- -------------------- 
a          1           a1--a的第一个值
b          1           b1--b的第一个值
*/

--三、按name分组第一次出现的行所在的数据。
select a.* from tb a where val = (select top 1 val from tb where name = a.name) order by a.name
/*
name       val         memo                 
---------- ----------- -------------------- 
a          2           a2(a的第二个值)
b          1           b1--b的第一个值
*/

--四、按name分组随机一条数据。
select a.* from tb a where val = (select top 1 val from tb where name = a.name order by newid()) order by a.name
/*
name       val         memo                 
---------- ----------- -------------------- 
a          1           a1--a的第一个值
b          5           b5b5b5b5b5
*/

--五、按name分组最小的两个(N个)val
select a.* from tb a where 2 > (select count(*from tb where name = a.name and val < a.val ) order by a.name,a.val
select a.* from tb a where val in (select top 2 val from tb where name=a.name order by val) order by a.name,a.val
select a.* from tb a where exists (select count(*from tb where name = a.name and val < a.val having Count(*< 2order by a.name
/*
name       val         memo                 
---------- ----------- -------------------- 
a          1           a1--a的第一个值
a          2           a2(a的第二个值)
b          1           b1--b的第一个值
b          2           b2b2b2b2
*/
分享到:
评论

相关推荐

    按某一字段分组取最大(小)值所在行的数据

    按某一字段分组取最大(小)值所在行的数据

    mysql分组取每组前几条记录(排名) 附group by与order by的研究

    –按某一字段分组取最大(小)值所在行的数据 代码如下: /* 数据如下: nameval memo a 2 a2(a的第二个值) a 1 a1–a的第一个值 a 3 a3:a的第三个值 b 1 b1–b的第一个值 b 3 b3:b的第三个值 b 2 b2b2b2b2 b 4 b4b4 b ...

    pb通过sql语句实现分组小计统计

    在本文中,我们将深入探讨如何使用SQL语句实现分组小计统计,这是一个常见的需求,尤其是在数据分析、报表生成和业务洞察领域。我们将基于提供的部分代码示例,详细解释其背后的逻辑和技术要点。 ### SQL实现分组小...

    搜集大乌龟,诌老大的sql经典

    要按`name`分组取最大`val`值所在行的数据,有以下五种常见方法: 1. **子查询关联法**: ```sql select a.* from tb a where val = (select max(val) from tb where name = a.name) order by a.name; ``` 这种...

    程序员的SQL金典.rar

     11.8.1 将结果集转置为一行  11.8.2 把结果集转置为多行  11.9 递归查询  11.9.1 Oracle中的CONNECT BY子句  11.9.2 Oracle中的SYS_CONNECT_BY_PATH()函数  11.9.3 My SQL Server和DB2中递归查询 附录A 常用...

    PB中SQL 数据查询技术

    3. **分组查询**:GROUP BY子句用于将结果集按指定的字段进行分组,常与聚合函数(如COUNT、SUM、AVG、MAX、MIN)一起使用,以便对每个组进行统计计算。例如,`SELECT CustomerCity, COUNT(*) FROM Orders GROUP BY ...

    SQLServer索引与数据完整性.pdf

    - **快速存取数据**: 通过索引可以快速定位到数据所在的行,从而提高查询效率。 - **保证数据记录的唯一性**: 通过唯一索引可以确保表中的某些列具有唯一的值。 - **实现表与表之间的参照完整性**: 通过外键索引...

    自己整理的sql常用语句

    - **应用场景**:需要按某个字段进行分组,并统计每个分组内另一字段的总和时使用。 - **解析**:`GROUP BY`子句用于将数据划分为多个组,以便进行聚合函数操作。 **7. `SELECT 字段1, SUM(字段2) FROM table ...

    建立Microsoft_SQL_Server_2005数据仓库

    在本文中,我们将探讨如何建立一个基于Microsoft SQL Server 2005的数据仓库,特别关注如何使用分析服务来创建一个图书订单统计系统。数据仓库是存储历史数据并优化查询性能的系统,它主要用于报告和数据分析。 ...

    SQL查询语句例子.pdf

    其中,分组字段是数据表中的一个或多个字段,用于分组数据。 Order by子句 Order by子句用于对数据进行排序,基本语法为: `SELECT 字段列表 FROM 数据表名 ORDER BY 排序字段列表 [DESC]` 其中,排序字段列表...

    SQL——21天

    - **GROUP BY子句**:将结果集按一个或多个列进行分组。 - **HAVING子句**:用于过滤GROUP BY子句的结果。 - **子句的综合应用**:结合以上子句构建更复杂的查询。 #### 第六天:表的联合 - **介绍**:讲解了联合的...

    2009达内SQL学习笔记

    SQL语句可以在一行上写出,建议多行写出,便于阅读和调试。 多条SQL语句必须以分号分隔。多数DBMS不需要在单条SQL语句后加分号,但特定的DBMS可能必须在单条SQL语句后加分号。 SQL语句的最后一句要以 “;”号...

    Oracle的sql语句练习题及参考答案

    3. **分组**:`GROUP BY`用于将数据按一列或多列进行分组,常与聚合函数(如`COUNT`, `SUM`, `AVG`, `MIN`, `MAX`)一起使用: ```sql SELECT Department, COUNT(*) FROM Employees GROUP BY Department; ```...

    SQL21自学通.pdf

    - **背景**:SELECT语句是SQL中最常用的语句之一,用于从数据库中检索数据。 - **一般的语法规则**:SELECT语句的基本格式是`SELECT column_name(s) FROM table_name WHERE condition;`。其中,`column_name(s)`表示...

    21天精通sql,21日精通sql

    《21天精通SQL》是一本专为初学者和进阶者设计的SQL教程,旨在帮助读者在21天内掌握SQL的核心概念和技术。SQL,全称Structured Query Language(结构化查询语言),是用于管理关系数据库的标准语言。本书涵盖了SQL的...

    sql语句万能生成器,sql语句,sql语句生成

    SQL语句是数据库操作的核心,它用于查询、插入、更新和删除数据,是任何数据库管理系统中的基础工具。在IT行业中,编写SQL语句是一项必备技能,但手动编写和调试SQL语句可能会耗费大量时间和精力,尤其在处理复杂...

    SQL21天自学通.pdf

    - SQL是一种非过程化的语言,主要用于数据定义、数据操纵、数据控制和数据查询。 - 主要包括DDL(Data Definition Language,数据定义语言)、DML(Data Manipulation Language,数据操纵语言)、DCL(Data ...

    SQL的数据查询功能2[归类].pdf

    还可以使用`AS`给字段设置别名,`DISTINCT`去除重复行,`TOP`和`PERCENT`用于限制返回的记录数量,`ORDER BY`控制结果的排序,`GROUP BY`对字段进行分组,而`HAVING`则在分组后过滤数据。 接下来是连接查询,它允许...

Global site tag (gtag.js) - Google Analytics