--
按某一字段分组取最大(小)值所在行的数据
(爱新觉罗.毓华
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 行受影响)
*/
分享到:
相关推荐
在MySQL中,获取分组后每组的最大值是一项常见的数据分析任务,这通常涉及到聚合函数和分组查询。本文将详细讲解如何使用SQL语句来实现这个功能,通过一个具体的实例来帮助理解。 首先,我们创建了一个名为`test`的...
–按某一字段分组取最大(小)值所在行的数据 代码如下: /* 数据如下: 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条最大记录的功能。通过精心设计的SQL查询语句,我们可以有效地解决这类问题。这种方法不仅适用于上述具体场景,还可以扩展应用于其他类似的需求,例如按不同标准分组并...
在MySQL数据库中,当执行`GROUP BY`语句时,通常是为了对数据进行分组并进行聚合计算,如计算每个组的总数、平均值等。然而,标准的`GROUP BY`查询并不直接提供每个组的行数,而是返回每个组的一行数据。如果需要...
- `Max()`: 获取最大值。 - `Min()`: 获取最小值。 - `Count()`: 计算记录数。 - 特别注意: 所有的分组函数都会忽略`NULL`值。 **流程控制函数**: - `If()`: 根据条件执行不同的操作。 - `Case` 表达式: 提供更复杂...
其中,COUNT()用于计数,SUM()用于求和,AVG()用于计算平均值,MAX()和MIN()用于找出最大值和最小值。 4. 多表连接:在数据库中,表之间往往存在关联关系,需要将多个表的数据结合在一起进行查询。多表连接包括内...
- `MAX(column_name)`用于查找最大值。 - **1.8.5 min** - `MIN(column_name)`用于查找最小值。 - **1.8.6 组合聚合函数** - 可以组合使用多个聚合函数。 #### 八、分组查询 - **1.9 分组查询** - **1.9.1 ...
MySQL以YYYY-MM-DD格式来显示DATE值,但是允许你使用字符串或数字把值赋给DATE列 4.CHAR(M) 型:定长字符串类型,当存储时,总是是用空格填满右边到指定的长度 5.BLOB TEXT类型,最大长度为(2^16-1)个字符。 6...
- SELECT:查询数据,可以使用WHERE子句过滤,GROUP BY进行分组,ORDER BY进行排序,HAVING处理分组后的过滤。 - UPDATE:更新表中的数据,通常与WHERE子句一起使用。 - DELETE FROM:删除表中的数据,同样可与...
- 在MySQL中,使用`GROUP BY`子句进行分组查询非常直观,可以轻松结合`COUNT`、`SUM`等聚合函数来完成数据统计。 - 示例:`SELECT name, COUNT(money) FROM user GROUP BY name;` - **Oracle**: - Oracle也支持...
- `COUNT(*)`计算行数,`SUM(column)`求和,`AVG(column)`计算平均值,`MAX(column)`取最大值,`MIN(column)`取最小值。例如,`SELECT AVG(Salary) FROM Employees;`会返回员工的平均薪水。 4. **分组与聚合** ...
2. **最大值与最小值**:`MAX()`和`MIN()`分别用于找出最大值和最小值。 3. **计数**:`COUNT()`用于统计行数。 4. **特点总结**:这些聚合函数通常忽略`NULL`值,并且可以与`DISTINCT`关键字结合使用来消除重复项。...
- `COUNT`、`SUM`、`AVG`、`MAX`、`MIN`分别用于统计数量、求和、计算平均值、找出最大值和最小值。 19. **分组和筛选**: - `GROUP BY`用于数据分组。 - `HAVING`用于筛选分组后的数据。 20. **字符串和数学...
- `SUM`, `AVG`, `MIN`, `MAX`: 聚合函数,分别用于求和、平均值、最小值和最大值。 8. 排序与分页: - `ORDER BY`: 排序,如`SELECT * FROM users ORDER BY name ASC;` (ASC升序,DESC降序) - `LIMIT`: 分页,...
(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 ...
- MAX(): 用于找出查询结果中的最大值。 - MIN(): 用于找出查询结果中的最小值。 - SUM(): 用于计算查询结果中数值列的总和。 2. 数据操作: - 选择(选择查询): 从表中选取满足特定条件的行。 - 投影(投影...
10. **汇总数据**:使用聚集函数如`SUM`求和,`AVG`求平均,`COUNT`计数,`MAX`取最大值,`MIN`取最小值,可以对一组数据进行统计分析。 11. **分组数据**:`GROUP BY`用于按指定字段进行分组,`HAVING`过滤分组后...