--按某一字段分组取最大(小)值所在行的数据
/*
数据如下:
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条最大记录的功能。通过精心设计的SQL查询语句,我们可以有效地解决这类问题。这种方法不仅适用于上述具体场景,还可以扩展应用于其他类似的需求,例如按不同标准分组并...
提供了一些实用的SQL技巧,比如检索包含最大/最小值的行、利用随机函数、分组统计等,这些技巧可以提高数据库操作的效率和灵活性。 11. 优化篇: 此部分涉及数据库的性能优化,包括SQL语句的优化、索引问题、数据库...
在 MySQL 中,可以通过配置参数 `max_allowed_packet` 来设置最大允许的网络数据包大小,默认值通常是 1MB,可以根据需要调整到更大的值,但需要注意不要超出系统限制。 #### 问题10:你对游标的理解,游标的分类 ...
MySQL是一种广泛使用的开源关系型数据库管理系统,其性能和效率很大程度上取决于索引的使用和设计。索引是数据库系统中的重要组成部分,它极大地提升了数据查询的速度。本资料“深入理解MySQL索引底层”将帮助我们...
本篇文章将详细探讨三种不同的SQL语句实现方式,以解决“每个用户取1条记录”的问题,重点讨论它们的工作原理以及性能差异。 1. **先排序后分组** 这种方法首先按照`id`降序排列所有记录,然后通过`GROUP BY`对`...
在MySQL中,即使删除了一些具有较大ID值的记录,新增记录时仍会从最大的已用ID值继续递增。因此,如果最大ID为10,删除了9和10后,再次插入记录时,其ID将是11。 #### 015. 索引的优缺点 **优点**: - 加速数据...
1. **结果长度限制**:`GROUP_CONCAT`函数生成的字符串有最大长度限制,这取决于系统变量`group_concat_max_len`。默认值可能较小,可以通过设置该变量来增加长度,例如: ```sql SET session group_concat_max_...
- **含义**: `INT(10)` 中的数字 10 并不代表整数的存储大小,而是指在查询结果中显示该整数值时所占用的最大字符数。例如,如果存储的整数为 123,则实际显示时会占用 3 个字符位置,即使 `INT` 后面跟的是 10。 - ...
2. **聚合函数**:SUM、COUNT、AVG、MAX和MIN等函数用于对一组值进行计算,例如计算总和、平均值或最大最小值。GROUP BY语句结合HAVING子句用于按一个或多个字段对数据分组,并对每个组应用聚合函数。 3. **插入...
- **MAX**:找出特定列的最大值。 - **MIN**:找出特定列的最小值。 - **VARIANCE**、**STDDEV**:分别计算方差和标准差。 - **日期/时间函数**: - **ADD_MONTHS**、**LAST_DAY**、**MONTHS_BETWEEN**等,用于...
(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. 修改高级表格支持库,解决在鼠标按下和抬起之间收到时钟周期...
- **聚合函数**:AVG计算平均值,SUM求和,MAX取最大值,MIN取最小值,COUNT(*)返回所有行数,COUNT返回满足条件的记录数。 - **JOIN操作**: - **INNER JOIN**:返回两个表中匹配的记录,语法:`SELECT ... FROM...
- **MAX()** 和 **MIN()**:找出最大值和最小值。 3. **分组与聚合**: - **GROUP BY子句**:按指定列对数据进行分组。 - **HAVING子句**:在分组后设置条件过滤。 4. **连接查询**: - **INNER JOIN**:返回...
- **GREATEST**/ **LEAST**:返回一组值中的最大值/最小值。 - **USER**:获取当前用户信息。 #### 第五天:SQL中的子句 - **WHERE子句**:用于过滤查询结果,只返回满足特定条件的记录。 - **STARTING WITH子句*...
10. **排序与分组**:减少`ORDER BY`和`GROUP BY`的使用,尤其是在没有索引的列上。 11. **索引比较**:避免对索引列使用`NOT`或`!=`,可以拆分为多个条件。 12. **函数与表达式位置**:数据库函数和计算表达式应...
Mysql 甲骨文 是个开源的数据库server,可运行在多种平台, 特点是响应速度特别快,主要面向中小企业 中小型企业 PostgreSQL 号称“世界上最先进的开源数据库“,可以运行在多种平台下,是tb级数据库,而且性能也很...