7、SQL Server:sql server 获取每一个类别中值最大的一条数据

本文来自:http://www.cnblogs.com/zfanlong1314/p/3393946.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/*
数据如下:
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  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
*/
 
    

写法6

SELECT  *
FROM    (
          SELECT    * ,
                    ROW_NUMBER() OVER ( PARTITION BY name ORDER BY val DESC ) rid
          FROM      tb
        ) AS t
WHERE   rid = 1

 

 

如果上述存在一个name组中有两个以上相同的val,则查询方法1-5不正确。

例如:

insert into tb values('a',    2,   'a2(a的第二个值)') 
insert into tb values('a',    3,   'a1--a的第一个值') 
insert into tb values('a',    3,   'a3:a的第三个值') 

 

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值