SQL Server 按某一字段分组取最大(小)值所在行的数据
SQL
Server 按某一字段分组
取
最大
(小)值所在行的数据
--
按某一字段分组
取
最大
(小)值所在行的数据
--
(爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开) 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
*/
本文转载于:http://hi.baidu.com/lr02/blog/item/d9262e300683ac95a9018eb7.html
分享到:
相关推荐
按某一字段分组取最大(小)值所在行的数据
SQL Server 2011 是 Microsoft 公司推出的一款关系型数据库管理系统,它基于客户/服务器(Client/Server)架构,提供高效的数据存储、管理和分析功能。在学习和使用 SQL Server 2011 时,了解其基本概念和操作是至关...
SQL Server是一种广泛使用的关系型数据库管理系统,由微软公司开发,提供了强大的数据存储、查询和管理功能。本笔记主要针对SQL Server的语法进行整理,旨在帮助初学者快速掌握基础概念和常用操作。 一、SQL简介 ...
### SQL Server索引与数据完整性知识点详解 #### 一、索引的概念与作用 - **定义**: 索引是在数据库表中一列或多列上建立的一种数据结构,用于提高数据检索的速度。 - **作用**: - **快速存取数据**: 通过索引可以...
SQL Server 是一款由微软公司开发的关系型数据库管理系统(RDBMS),在IT行业中广泛用于存储、管理和处理数据。SQL(Structured Query Language)是用于与数据库交互的语言,是SQL Server的核心工具。对于初学者来说...
2. 唯一性约束:在 SQL Server 中,主键约束用于保证表中某一列或一组列的值是唯一的,以此唯一标识每一行,选项A是正确答案。 3. 数据类型:在 SQL Server 中,二进制数据类型包括 Binary、Image 和 VarBinary,而...
在本文中,我们将探讨如何建立一个基于Microsoft SQL Server 2005的数据仓库,特别关注如何使用分析服务来创建一个图书订单统计系统。数据仓库是存储历史数据并优化查询性能的系统,它主要用于报告和数据分析。 ...
根据提供的标题和描述,本文将详细介绍在MySQL、SQL Server以及Oracle数据库中常用的函数。这些函数主要分为几大类:字符串处理函数、数值处理函数、日期处理函数、转换函数以及其他一些特殊用途的函数。 ### 字符...
SQL Server 是一个功能强大的关系型数据库管理系统,广泛应用于企业级数据存储、管理和分析。本教程主要涉及SQL Server的基础知识,包括数据库和表的创建、数据的增删查改等核心概念。 首先,我们来看如何在SQL ...
非聚簇索引(nonclustered indexes)是SQL Server默认建立的索引类型,它不会重新组织表中的数据,而是为每一行存储索引列值并用指针指向数据所在的页面。与聚簇索引相比,非聚簇索引在数据页和索引结构之间增加了一个...
10.4.2 MS SQL Server中的自动增长字段 10.4.3 Oracle中的自动增长字段 10.4.4 DB2中的自动增长字段 10.5 业务主键与逻辑主键 10.6 NULL的学问 10.6.1 NULL与比较运算符 10.6.2 NULL和计算字段 ...
《SQL Server数据库基础》技能测试试卷二主要涵盖了SQL Server数据库管理系统的基础知识,旨在评估考生对数据库原理、设计、管理和分析的能力。SQL Server是由微软公司开发的一款广泛应用的大型数据库管理系统,对于...
### SQL Server索引调优实践 #### 索引的重要性 在数据库性能优化的过程中,索引扮演着极其重要的角色。不恰当的索引使用会导致其他优化措施的效果大打折扣,甚至变得毫无意义。因此,了解如何正确地创建、管理和...
3. 聚合函数:COUNT、SUM、AVG、MAX和MIN等,用于计算一组值的总数、总和、平均值、最大值和最小值。 4. 视图(View):虚拟表,由SELECT语句定义,提供了一种简化复杂查询和保护数据隐私的方式。 5. 存储过程:预...
- `GROUP BY`: 用于将数据按指定列分组。 - `HAVING`: 与`GROUP BY`一起使用,用于过滤分组后的结果集。 #### 知识点五:DBCC SHRINKDATABASE命令解析 - **知识点概述**: - `DBCC SHRINKDATABASE`命令用于缩小...
例如,可以使用`CASE WHEN` 将国家人口数据按洲进行分组,如果知道每个国家所在的洲,可以直接计算各洲的人口总数。如果没有洲的信息,可能需要额外的地理数据或者创建视图来获取这些信息。 总之,`CASE WHEN` 是...