博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL Server 按某一字段分组 取 最大 (小)值所在行的数据
阅读量:4972 次
发布时间:2019-06-12

本文共 3306 字,大约阅读时间需要 11 分钟。

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
*/

转载于:https://www.cnblogs.com/doudou618/p/5019737.html

你可能感兴趣的文章
分布式锁的三种实现方式
查看>>
poj 2109 pow函数也能这么用?p的开n次方
查看>>
Oracle database link
查看>>
清北学堂2017NOIP冬令营入学测试P4749 F’s problem(f)
查看>>
POJ 1840 Eqs HASH
查看>>
python调用shell小技巧
查看>>
TL431的几种常用用法
查看>>
BZOJ 1833: [ZJOI2010]count 数字计数( dp )
查看>>
关于toString()和String()要说几句话
查看>>
bzoj 3751[NOIP2014]解方程
查看>>
CSS(二) 文字样式属性,背景和列表
查看>>
js 经典闭包题目详解
查看>>
在项目中移除CocoaPods
查看>>
面试题三 替换空格
查看>>
LeetCode104.二叉树最大深度
查看>>
linux usb驱动——Gadget代码介绍
查看>>
【洛谷】CYJian的水题大赛【第二弹】解题报告
查看>>
POJ 1703 Find them, Catch them【种类/带权并查集+判断两元素是否在同一集合/不同集合/无法确定+类似食物链】...
查看>>
L1-5. A除以B【一种输出格式错了,务必看清楚输入输出】
查看>>
Git一分钟系列--快速安装git客户端
查看>>