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存储过 ...
随机推荐
- css_兼容IE和FF的写法
CSS对浏览器器的兼容性具有很高的价值,通常情况下IE和Firefox存在很大的解析差异,这里介绍一下兼容要点. 常见兼容问题: 1.DOCTYPE 影响 CSS 处理2.FF:div 设置 marg ...
- canvas drawImage异步特性
先看代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- 20145218 《Java程序设计》第04次实验报告
北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1452 指导教师:娄嘉鹏 实验日期:2016.04.22 实验名称:Android开发基础 一.实验内容 1.基于Android ...
- centos7配置mono和jexus5.6.2
一.通过集成包安装mono: 1.添加Mono的 包库源: 把Mono Project public Jenkins GPG signing 导入系统 wget http://jenkins.mon ...
- HTML5自学笔记[ 24 ]canvas绘图之星空草地
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- Qt之Concurrent框架
简述 QtConcurrent命名空间提供了一个高级API来编写多线程程序,而无需使用低级线程原语,例如:互斥.读写锁.等待条件或信号量.使用QtConcurrent编写的程序使用的线程数量会自动根据 ...
- Sum Root to Leaf Numbers [LeetCode]
Problem description: http://oj.leetcode.com/problems/sum-root-to-leaf-numbers/ Basic idea: To store ...
- from __future__ import absolute_import
from __future__ import absolute_import 这样以后:局部的包将不能覆盖全局的包, 本地的包必须使用相对引用了. 例: from celery import Cele ...
- struts2 <s:iterator> status属性
struts2 <s:iterator> status属性 转载▼ iterator标签主要是用于迭代输出集合元素,如list set map 数组等,在使用标签的时候有三个属性值得我 ...
- 20145236 《Java程序设计》第4周学习总结
20145236 <Java程序设计>第4周学习总结 教材学习内容总结 第六章 继承与多态 一.继承 •继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类.继承可以理解 ...