`
liyonghui160com
  • 浏览: 775936 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mysql分组排序取最大(小)值的问题

阅读更多

 

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

/*

数据如下:

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(*) < 2) order by a.name

/*

name       val         memo                

---------- ----------- --------------------

a          1           a1--a的第一个值

a          2           a2(a的第二个值)

b          1           b1--b的第一个值

b          2           b2b2b2b2

*/

--六、按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 desc) 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(*) < 2) order by a.name

/*

name       val         memo                

---------- ----------- --------------------

a          2           a2(a的第二个值)

a          3           a3:a的第三个值

b          4           b4b4

b          5           b5b5b5b5b5

*/

分享到:
评论

相关推荐

    MySql实现分组取n条最大记录.txt

    本篇文章详细介绍了如何使用MySQL实现分组取n条最大记录的功能。通过精心设计的SQL查询语句,我们可以有效地解决这类问题。这种方法不仅适用于上述具体场景,还可以扩展应用于其他类似的需求,例如按不同标准分组并...

    Mysql网易内部教程

    提供了一些实用的SQL技巧,比如检索包含最大/最小值的行、利用随机函数、分组统计等,这些技巧可以提高数据库操作的效率和灵活性。 11. 优化篇: 此部分涉及数据库的性能优化,包括SQL语句的优化、索引问题、数据库...

    MySQL数据库工程师常见面试题

    在 MySQL 中,可以通过配置参数 `max_allowed_packet` 来设置最大允许的网络数据包大小,默认值通常是 1MB,可以根据需要调整到更大的值,但需要注意不要超出系统限制。 #### 问题10:你对游标的理解,游标的分类 ...

    深入理解mysql索引底层.zip

    MySQL是一种广泛使用的开源关系型数据库管理系统,其性能和效率很大程度上取决于索引的使用和设计。索引是数据库系统中的重要组成部分,它极大地提升了数据查询的速度。本资料“深入理解MySQL索引底层”将帮助我们...

    关于MYSQL中每个用户取1条记录的三种写法(group by xxx)

    本篇文章将详细探讨三种不同的SQL语句实现方式,以解决“每个用户取1条记录”的问题,重点讨论它们的工作原理以及性能差异。 1. **先排序后分组** 这种方法首先按照`id`降序排列所有记录,然后通过`GROUP BY`对`...

    最新150道MySQL大厂面试题课程

    在MySQL中,即使删除了一些具有较大ID值的记录,新增记录时仍会从最大的已用ID值继续递增。因此,如果最大ID为10,删除了9和10后,再次插入记录时,其ID将是11。 #### 015. 索引的优缺点 **优点**: - 加速数据...

    mysql如何将多行数据合并成一行

    1. **结果长度限制**:`GROUP_CONCAT`函数生成的字符串有最大长度限制,这取决于系统变量`group_concat_max_len`。默认值可能较小,可以通过设置该变量来增加长度,例如: ```sql SET session group_concat_max_...

    MySQL 40 道面试题及答案.docx

    - **含义**: `INT(10)` 中的数字 10 并不代表整数的存储大小,而是指在查询结果中显示该整数值时所占用的最大字符数。例如,如果存储的整数为 123,则实际显示时会占用 3 个字符位置,即使 `INT` 后面跟的是 10。 - ...

    niit sql 课后习题与答案(全)

    2. **聚合函数**:SUM、COUNT、AVG、MAX和MIN等函数用于对一组值进行计算,例如计算总和、平均值或最大最小值。GROUP BY语句结合HAVING子句用于按一个或多个字段对数据分组,并对每个组应用聚合函数。 3. **插入...

    SQL21简单语句1111111111111111

    - **MAX**:找出特定列的最大值。 - **MIN**:找出特定列的最小值。 - **VARIANCE**、**STDDEV**:分别计算方差和标准差。 - **日期/时间函数**: - **ADD_MONTHS**、**LAST_DAY**、**MONTHS_BETWEEN**等,用于...

    2009达内SQL学习笔记

    (BETWEEN 小值 AND 大值) 如:select last_name,salary from s_emp where salary between 1000 and 1500; --工资1000到1500的人,包括1000和1500。 in(列表):在列表里面的。 如:select last_name,dept_id ...

    易语言程序免安装版下载

    修复了滑块条的选择长度不能到最大的问题 对其它支持库的更新: 1. 修改XML解析支持库,解决“XML树.取节点值文本()”返回的文本会失效的BUG。 2. 修改高级表格支持库,解决在鼠标按下和抬起之间收到时钟周期...

    SQL笔试题解答()

    - **聚合函数**:AVG计算平均值,SUM求和,MAX取最大值,MIN取最小值,COUNT(*)返回所有行数,COUNT返回满足条件的记录数。 - **JOIN操作**: - **INNER JOIN**:返回两个表中匹配的记录,语法:`SELECT ... FROM...

    sql 语言练习题

    - **MAX()** 和 **MIN()**:找出最大值和最小值。 3. **分组与聚合**: - **GROUP BY子句**:按指定列对数据进行分组。 - **HAVING子句**:在分组后设置条件过滤。 4. **连接查询**: - **INNER JOIN**:返回...

    SQL21天自学通

    - **GREATEST**/ **LEAST**:返回一组值中的最大值/最小值。 - **USER**:获取当前用户信息。 #### 第五天:SQL中的子句 - **WHERE子句**:用于过滤查询结果,只返回满足特定条件的记录。 - **STARTING WITH子句*...

    SQL编程规范 SQL编程规范

    10. **排序与分组**:减少`ORDER BY`和`GROUP BY`的使用,尤其是在没有索引的列上。 11. **索引比较**:避免对索引列使用`NOT`或`!=`,可以拆分为多个条件。 12. **函数与表达式位置**:数据库函数和计算表达式应...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    Mysql 甲骨文 是个开源的数据库server,可运行在多种平台, 特点是响应速度特别快,主要面向中小企业 中小型企业 PostgreSQL 号称“世界上最先进的开源数据库“,可以运行在多种平台下,是tb级数据库,而且性能也很...

Global site tag (gtag.js) - Google Analytics