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
*/--创建表并插入数据:createtable tb(name varchar(10),val int,memo varchar(20))
insertinto tb values('a', 2, 'a2(a的第二个值)')
insertinto tb values('a', 1, 'a1--a的第一个值')
insertinto tb values('a', 3, 'a3:a的第三个值')
insertinto tb values('b', 1, 'b1--b的第一个值')
insertinto tb values('b', 3, 'b3:b的第三个值')
insertinto tb values('b', 2, 'b2b2b2b2')
insertinto tb values('b', 4, 'b4b4')
insertinto tb values('b', 5, 'b5b5b5b5b5')
go--一、按name分组取val最大的值所在行的数据。
--方法1:select a.*from tb a where val = (selectmax(val) from tb where name = a.name) orderby a.name
--方法2:select a.*from tb a wherenotexists(select1from tb where name = a.name and val > a.val)
--方法3:select a.*from tb a,(select name,max(val) val from tb groupby name) b where a.name = b.name and a.val
= b.val orderby a.name
--方法4:select a.*from tb a innerjoin (select name , max(val) val from tb groupby name) b on a.name = b.name
and a.val = b.val orderby a.name
--方法5select a.*from tb a where1> (selectcount(*) from tb where name = a.name and val > a.val ) orderby a.name
/*
name val memo
---------- ----------- --------------------
a 3 a3:a的第三个值
b 5 b5b5b5b5b5
*/--二、按name分组取val最小的值所在行的数据。
--方法1:select a.*from tb a where val = (selectmin(val) from tb where name = a.name) orderby a.name
--方法2:select a.*from tb a wherenotexists(select1from tb where name = a.name and val < a.val)
--方法3:select a.*from tb a,(select name,min(val) val from tb groupby name) b where a.name = b.name and a.val
= b.val orderby a.name
--方法4:select a.*from tb a innerjoin (select name , min(val) val from tb groupby name) b on a.name = b.name
and a.val = b.val orderby a.name
--方法5select a.*from tb a where1> (selectcount(*) from tb where name = a.name and val < a.val) orderby a.name
/*
name val memo
---------- ----------- --------------------
a 1 a1--a的第一个值
b 1 b1--b的第一个值
*/--三、按name分组取第一次出现的行所在的数据。select a.*from tb a where val = (selecttop1 val from tb where
name = a.name) orderby a.name
/*
name val memo
---------- ----------- --------------------
a 2 a2(a的第二个值)
b 1 b1--b的第一个值
*/--四、按name分组随机取一条数据。select a.*from tb a where val = (selecttop1 val from tb where name = a.name
orderbynewid()) orderby a.name
/*
name val memo
---------- ----------- --------------------
a 1 a1--a的第一个值
b 5 b5b5b5b5b5
*/--五、按name分组取最小的两个(N个)valselect a.*from tb a where2> (selectcount(*) from tb where name =
a.name and val < a.val ) orderby a.name,a.val
select a.*from tb a where val in (selecttop2 val from tb where name=a.name orderby val) orderby a.name,a.val
select a.*from tb a whereexists (selectcount(*) from tb where name = a.name and val < a.val havingCount(*) <2)
orderby a.name
/*
name val memo
---------- ----------- --------------------
a 1 a1--a的第一个值
a 2 a2(a的第二个值)
b 1 b1--b的第一个值
b 2 b2b2b2b2
*/--六、按name分组取最大的两个(N个)valselect a.*from tb a where2> (selectcount(*) from tb where name =
a.name and val > a.val ) orderby a.name,a.val
select a.*from tb a where val in (selecttop2 val from tb where name=a.name orderby val desc) orderby
a.name,a.val
select a.*from tb a whereexists (selectcount(*) from tb where name = a.name and val > a.val havingCount(*) <2)
orderby a.name
/*
name val memo
---------- ----------- --------------------
a 2 a2(a的第二个值)
a 3 a3:a的第三个值
b 4 b4b4
b 5 b5b5b5b5b5
*/--七,如果整行数据有重复,所有的列都相同。
/*
数据如下:
name val memo
a 2 a2(a的第二个值)
a 1 a1--a的第一个值
a 1 a1--a的第一个值
a 3 a3:a的第三个值
a 3 a3:a的第三个值
b 1 b1--b的第一个值
b 3 b3:b的第三个值
b 2 b2b2b2b2
b 4 b4b4
b 5 b5b5b5b5b5
*/--在sql server 2000中只能用一个临时表来解决,生成一个自增列,先对val取最大或最小,然后再通过自增列来取
数据。
--创建表并插入数据:createtable tb(name varchar(10),val int,memo varchar(20))
insertinto tb values('a', 2, 'a2(a的第二个值)')
insertinto tb values('a', 1, 'a1--a的第一个值')
insertinto tb values('a', 1, 'a1--a的第一个值')
insertinto tb values('a', 3, 'a3:a的第三个值')
insertinto tb values('a', 3, 'a3:a的第三个值')
insertinto tb values('b', 1, 'b1--b的第一个值')
insertinto tb values('b', 3, 'b3:b的第三个值')
insertinto tb values('b', 2, 'b2b2b2b2')
insertinto tb values('b', 4, 'b4b4')
insertinto tb values('b', 5, 'b5b5b5b5b5')
goselect* , px =identity(int,1,1) into tmp from tb
select m.name,m.val,m.memo from
(
select t.*from tmp t where val = (selectmin(val) from tmp where name = t.name)
) m where px = (selectmin(px) from
(
select t.*from tmp t where val = (selectmin(val) from tmp where name = t.name)
) n where n.name = m.name)
droptable tb,tmp
/*
name val memo
---------- ----------- --------------------
a 1 a1--a的第一个值
b 1 b1--b的第一个值
(2 行受影响)
*/--在sql server 2005中可以使用row_number函数,不需要使用临时表。
--创建表并插入数据:createtable tb(name varchar(10),val int,memo varchar(20))
insertinto tb values('a', 2, 'a2(a的第二个值)')
insertinto tb values('a', 1, 'a1--a的第一个值')
insertinto tb values('a', 1, 'a1--a的第一个值')
insertinto tb values('a', 3, 'a3:a的第三个值')
insertinto tb values('a', 3, 'a3:a的第三个值')
insertinto tb values('b', 1, 'b1--b的第一个值')
insertinto tb values('b', 3, 'b3:b的第三个值')
insertinto tb values('b', 2, 'b2b2b2b2')
insertinto tb values('b', 4, 'b4b4')
insertinto tb values('b', 5, 'b5b5b5b5b5')
goselect m.name,m.val,m.memo from
(
select* , px = row_number() over(orderby name , val) from tb
) m where px = (selectmin(px) from
(
select* , px = row_number() over(orderby name , val) from tb
) n where n.name = m.name)
droptable tb
/*
name val memo
---------- ----------- --------------------
a 1 a1--a的第一个值
b 1 b1--b的第一个值
分享到:
相关推荐
–按某一字段分组取最大(小)值所在行的数据 代码如下: /* 数据如下: 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 ...
mysql获取分组后每组的最大值实例详解 1. 测试数据库表如下: create table test ( `id` int not null auto_increment, `name` varchar(20) not null default '', `score` int not null default 0, primary key...
本篇文章详细介绍了如何使用MySQL实现分组取n条最大记录的功能。通过精心设计的SQL查询语句,我们可以有效地解决这类问题。这种方法不仅适用于上述具体场景,还可以扩展应用于其他类似的需求,例如按不同标准分组并...
在MySQL数据库中,当执行`GROUP BY`语句时,通常是为了对数据进行分组并进行聚合计算,如计算每个组的总数、平均值等。然而,标准的`GROUP BY`查询并不直接提供每个组的行数,而是返回每个组的一行数据。如果需要...
- `Max()`: 获取最大值。 - `Min()`: 获取最小值。 - `Count()`: 计算记录数。 - 特别注意: 所有的分组函数都会忽略`NULL`值。 **流程控制函数**: - `If()`: 根据条件执行不同的操作。 - `Case` 表达式: 提供更复杂...
MySQL以YYYY-MM-DD格式来显示DATE值,但是允许你使用字符串或数字把值赋给DATE列 4.CHAR(M) 型:定长字符串类型,当存储时,总是是用空格填满右边到指定的长度 5.BLOB TEXT类型,最大长度为(2^16-1)个字符。 6...
其中,COUNT()用于计数,SUM()用于求和,AVG()用于计算平均值,MAX()和MIN()用于找出最大值和最小值。 4. 多表连接:在数据库中,表之间往往存在关联关系,需要将多个表的数据结合在一起进行查询。多表连接包括内...
- MySQL中的字段长度相对较小,例如VARCHAR类型默认最大为255个字符。 - **Oracle**: - Oracle对于字段长度的限制更为严格,如VARCHAR2类型的默认最大长度为4000个字符。当需要存储更大数据量时,可以使用CLOB...
- `MAX(column_name)`用于查找最大值。 - **1.8.5 min** - `MIN(column_name)`用于查找最小值。 - **1.8.6 组合聚合函数** - 可以组合使用多个聚合函数。 #### 八、分组查询 - **1.9 分组查询** - **1.9.1 ...
- SELECT:查询数据,可以使用WHERE子句过滤,GROUP BY进行分组,ORDER BY进行排序,HAVING处理分组后的过滤。 - UPDATE:更新表中的数据,通常与WHERE子句一起使用。 - DELETE FROM:删除表中的数据,同样可与...
2. **最大值与最小值**:`MAX()`和`MIN()`分别用于找出最大值和最小值。 3. **计数**:`COUNT()`用于统计行数。 4. **特点总结**:这些聚合函数通常忽略`NULL`值,并且可以与`DISTINCT`关键字结合使用来消除重复项。...
(1)max:求最大值 求每个部门的最高工资: [sql] view plain copy select EMP_NAME,EMP_DEP,max(EMP_SALARY) from EMPLOYEES group by EMP_DEP; (2)min:求最小值 求每个部门的最仰工资: [sql] view plain ...
- **示例**:如果尝试插入一个超出范围的值,MySQL会将其调整为范围内的最大或最小值。 #### 18. 严格模式下的数据处理 - **定义**:严格模式下,MySQL会拒绝超出范围或不符合数据类型的值。 - **示例**:如果尝试...
- `COUNT`、`SUM`、`AVG`、`MAX`、`MIN`分别用于统计数量、求和、计算平均值、找出最大值和最小值。 19. **分组和筛选**: - `GROUP BY`用于数据分组。 - `HAVING`用于筛选分组后的数据。 20. **字符串和数学...
- `COUNT(*)`计算行数,`SUM(column)`求和,`AVG(column)`计算平均值,`MAX(column)`取最大值,`MIN(column)`取最小值。例如,`SELECT AVG(Salary) FROM Employees;`会返回员工的平均薪水。 4. **分组与聚合** ...
- MAX(): 用于找出查询结果中的最大值。 - MIN(): 用于找出查询结果中的最小值。 - SUM(): 用于计算查询结果中数值列的总和。 2. 数据操作: - 选择(选择查询): 从表中选取满足特定条件的行。 - 投影(投影...
- `SUM`, `AVG`, `MIN`, `MAX`: 聚合函数,分别用于求和、平均值、最小值和最大值。 8. 排序与分页: - `ORDER BY`: 排序,如`SELECT * FROM users ORDER BY name ASC;` (ASC升序,DESC降序) - `LIMIT`: 分页,...