`

分组后取最大值(mysql)

    博客分类:
  • 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
(
*
) 
<
 
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

*/


--
七,如果整行数据有重复,所有的列都相同。

/*

数据如下:
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取最大或最小,然后再通过自增列来取数据。

--
创建表并插入数据:


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
'
,    
1
,   
'
a1--a的第一个值
'
)

insert
 
into
 tb 
values
(
'
a
'
,    
3
,   
'
a3: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



select
 
*
 , px 
=
 
identity
(
int
,
1
,
1
) 
into
 tmp 
from
 tb


select
 m.name,m.val,m.memo 
from

(
  
select
 t.
*
 
from
 tmp t 
where
 val 
=
 (
select
 
min
(val) 
from
 tmp 
where
 name 
=
 t.name)
) m 
where
 px 
=
 (
select
 
min
(px) 
from

(
  
select
 t.
*
 
from
 tmp t 
where
 val 
=
 (
select
 
min
(val) 
from
 tmp 
where
 name 
=
 t.name)
) n 
where
 n.name 
=
 m.name)


drop
 
table
 tb,tmp


/*

name       val         memo
---------- ----------- --------------------
a          1           a1--a的第一个值
b          1           b1--b的第一个值

(2 行受影响)

*/


--
在sql server 2005中可以使用row_number函数,不需要使用临时表。

--
创建表并插入数据:


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
'
,    
1
,   
'
a1--a的第一个值
'
)

insert
 
into
 tb 
values
(
'
a
'
,    
3
,   
'
a3: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



select
 m.name,m.val,m.memo 
from

(
  
select
 
*
 , px 
=
 row_number() 
over
(
order
 
by
 name , val) 
from
 tb
) m 
where
 px 
=
 (
select
 
min
(px) 
from

(
  
select
 
*
 , px 
=
 row_number() 
over
(
order
 
by
 name , val) 
from
 tb
) n 
where
 n.name 
=
 m.name)


drop
 
table
 tb


/*

name       val         memo
---------- ----------- --------------------
a          1           a1--a的第一个值
b          1           b1--b的第一个值

(2 行受影响)

*/
分享到:
评论
1 楼 hellostory 2012-03-19  
极度无语...

相关推荐

    mysql获取分组后每组的最大值实例详解

    在MySQL中,获取分组后每组的最大值是一项常见的数据分析任务,这通常涉及到聚合函数和分组查询。本文将详细讲解如何使用SQL语句来实现这个功能,通过一个具体的实例来帮助理解。 首先,我们创建了一个名为`test`的...

    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 ...

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

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

    mysql获取group by总记录行数的方法

    在MySQL数据库中,当执行`GROUP BY`语句时,通常是为了对数据进行分组并进行聚合计算,如计算每个组的总数、平均值等。然而,标准的`GROUP BY`查询并不直接提供每个组的行数,而是返回每个组的一行数据。如果需要...

    joe_MySQL笔记

    - `Max()`: 获取最大值。 - `Min()`: 获取最小值。 - `Count()`: 计算记录数。 - 特别注意: 所有的分组函数都会忽略`NULL`值。 **流程控制函数**: - `If()`: 根据条件执行不同的操作。 - `Case` 表达式: 提供更复杂...

    mysql第五章.pdf

    其中,COUNT()用于计数,SUM()用于求和,AVG()用于计算平均值,MAX()和MIN()用于找出最大值和最小值。 4. 多表连接:在数据库中,表之间往往存在关联关系,需要将多个表的数据结合在一起进行查询。多表连接包括内...

    MySql培训日志_stu

    - `MAX(column_name)`用于查找最大值。 - **1.8.5 min** - `MIN(column_name)`用于查找最小值。 - **1.8.6 组合聚合函数** - 可以组合使用多个聚合函数。 #### 八、分组查询 - **1.9 分组查询** - **1.9.1 ...

    MySQL命令大全

    MySQL以YYYY-MM-DD格式来显示DATE值,但是允许你使用字符串或数字把值赋给DATE列 4.CHAR(M) 型:定长字符串类型,当存储时,总是是用空格填满右边到指定的长度 5.BLOB TEXT类型,最大长度为(2^16-1)个字符。 6...

    MYSQL使用手册MYSQL使用手册

    - SELECT:查询数据,可以使用WHERE子句过滤,GROUP BY进行分组,ORDER BY进行排序,HAVING处理分组后的过滤。 - UPDATE:更新表中的数据,通常与WHERE子句一起使用。 - DELETE FROM:删除表中的数据,同样可与...

    Oracle与MYSQL的几点区别

    - 在MySQL中,使用`GROUP BY`子句进行分组查询非常直观,可以轻松结合`COUNT`、`SUM`等聚合函数来完成数据统计。 - 示例:`SELECT name, COUNT(money) FROM user GROUP BY name;` - **Oracle**: - Oracle也支持...

    25.1 MySQL SELECT语句

    - `COUNT(*)`计算行数,`SUM(column)`求和,`AVG(column)`计算平均值,`MAX(column)`取最大值,`MIN(column)`取最小值。例如,`SELECT AVG(Salary) FROM Employees;`会返回员工的平均薪水。 4. **分组与聚合** ...

    mysql学习基础文件(个人整理)

    2. **最大值与最小值**:`MAX()`和`MIN()`分别用于找出最大值和最小值。 3. **计数**:`COUNT()`用于统计行数。 4. **特点总结**:这些聚合函数通常忽略`NULL`值,并且可以与`DISTINCT`关键字结合使用来消除重复项。...

    MySQL初学者入门笔记(教程来源:b站韩顺平老师)

    - `COUNT`、`SUM`、`AVG`、`MAX`、`MIN`分别用于统计数量、求和、计算平均值、找出最大值和最小值。 19. **分组和筛选**: - `GROUP BY`用于数据分组。 - `HAVING`用于筛选分组后的数据。 20. **字符串和数学...

    Mysql 常用命令锦集

    - `SUM`, `AVG`, `MIN`, `MAX`: 聚合函数,分别用于求和、平均值、最小值和最大值。 8. 排序与分页: - `ORDER BY`: 排序,如`SELECT * FROM users ORDER BY name ASC;` (ASC升序,DESC降序) - `LIMIT`: 分页,...

    MySql基本查询、连接查询、子查询、正则表达查询讲解

    (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数据库系统及应用第三套作业(5-7单元).pdf

    - MAX(): 用于找出查询结果中的最大值。 - MIN(): 用于找出查询结果中的最小值。 - SUM(): 用于计算查询结果中数值列的总和。 2. 数据操作: - 选择(选择查询): 从表中选取满足特定条件的行。 - 投影(投影...

    计算机二级《MySQL数据库程序设计》知识点总结.pdf

    10. **汇总数据**:使用聚集函数如`SUM`求和,`AVG`求平均,`COUNT`计数,`MAX`取最大值,`MIN`取最小值,可以对一组数据进行统计分析。 11. **分组数据**:`GROUP BY`用于按指定字段进行分组,`HAVING`过滤分组后...

Global site tag (gtag.js) - Google Analytics