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
*/
SQL Server 按某一字段分组 取 最大 (小)值所在行的数据的更多相关文章
- mysql按某一字段分组取最大(小)值所在行的数据
mysql按某一字段分组取最大(小)值所在行的数据 mysql技巧--按某一字段分组取最大(小)值所在行的数据,这是mysql数据库程序员经常用到的在处理一些报表数据时候可以活用!那么猎微网将总结 ...
- SQL Server数据库自增字段正确的插入值的描述
我们今天主要向大家讲述的是SQL Server数据库之向SQL Server自增字段正确的插入值的实际操作步骤,在一般的情况下,我们不能向 SQL Server 数据库自增字段中插入值,如果非要这么干 ...
- SQL Server数据库————连接查询和分组查询
SQL Server数据库————连接查询和分组查询 分组查询 select 列from <表名> where …… group by 列 注意:跟order by一样group ...
- SQL Server表描述 及 字段描述的增、删、改、查询
SQL Server表描述 及 字段描述的增.删.改.查询 --测试: --创建表及描述信息 ),isname )) --为表添加描述信息 EXECUTE sp_addextendedproperty ...
- SQL SERVER 表添加新字段
SQL SERVER 表添加新字段 ALTER TABLE doc_exa ADD column_b VARCHAR(20) NULL; -- doc_exa 是表名 -- column_b 是新加的 ...
- SQL Server的镜像是基于物理块变化的复制 镜像Failover之后数据的预热问题
SQL Server的镜像是基于物理块变化的复制 镜像Failover之后数据的预热问题 基于物理块变化的复制,没有并行也是很快的. 逻辑复制的日志是按事务结束的时间排序的,而物理复制是与事务无关的, ...
- SQL SERVER技术内幕之8 分组集
分组集就是分组(GROUP BY子句)使用的一组属性,在传统的SQL中,一个聚合查询只能定义一个分组集: 假设现在不想生成4个单独的结果集,而是希望生成一个统一的结果集,其中包含所有4个分组集的聚合 ...
- oracle 根据字段分组取第一条数据及rank函数说明
当前有这样一个需求,根据外键对子表数据进行分组,取每组中的一条数据就行了,如图: 如:COMMANDID = 26的有两条,只取一条数据. sql语句: select * from(select SY ...
- [转]Sql Server 给表与字段添加描述
/* 在SQL语句中通过系统存储过sp_addextendedproperty可为表字段添加上动态的说明(备注)下面是SQL SERVER帮助文档中对sp_addextendedproperty存储过 ...
随机推荐
- 【bzoj3160】【xsy1726】万径人踪灭
[bzoj3160]万径人踪灭 题意 给定一个由'a'和'b'构成的字符串,求不连续回文子序列的个数. \(n\leq 100000\) 分析 还是蛮不错的. 这道题基本上是自己想到的. 除了没有利用 ...
- container 的背后
如果要看laravel的单个功能的源代码,首先去找对应得ServiceProvider,例如加密功能hash,则按一下步骤查看源代码: HashServiceProvider.php(主要是看regi ...
- JS控制css float属性的用法经验总结
JavaScript与CSS属性的控制网上很常见,因此来说用js操作css属性是有一定规律的. 1.对于没有中划线的css属性一般直接使用style.属性名即可. 如:obj.style.margin ...
- 手机页面head中的meta元素
<meta http-equiv="Pragma" content="no-cache"> <meta http-equiv="ex ...
- 快速集成iOS基于RTMP的视频推流
前言 这篇blog是iOS视频直播初窥:<喵播APP>的一个补充. 因为之前传到github上的项目中没有集成视频的推流.有很多朋友简信和微博上问我推流这部分怎么实现的. 所以, 我重新集 ...
- 深入入门正则表达式(java)
一.入门基础 1.元字符 很多人对正则表达式的印象就是乱码..许许多多的符号组合在一起,偶见单词,正则确实是这样的,所以下面我们要看看这些符号都是什么意思 有些符号不是大家看到的字面上的意思:比如“. ...
- AppSettings和ConnectionStrings的区别
AppSettings是ASP.NET1.1时期用的,在.NET Framework 2.0中,新增了ConnectionStrings. 1.<connectionStrings> &l ...
- struts2视频学习笔记 11-12(动态方法调用,接收请求参数)
课时11 动态方法调用 如果Action中存在多个方法时,可以使用!+方法名调用指定方法.(不推荐使用) public String execute(){ setMsg("execute&q ...
- BZOJ3933 [CQOI2015]多项式
$\sum_{k = 0} ^ {n} a_kx^k = \sum_{k = 0} ^ {n} b_k(x - t)^k \Leftrightarrow \sum_{k = 0} ^ {n} a_k( ...
- C#伪静态实现的方法
在asp.net开发网站的时候,我们经常会用到伪静态,好处是可以隐藏真实的路径,提高网站的安全性,在官网等展示网站希望对搜索引擎友好,提高搜索排名:或者在涉及到模板开发都会用到伪静态.下面讲解下平时用 ...