先看一下本示例中需要使用到的數據
創建表並插入數據:
create table tb(name varchar(10),val int,memo varchar(20))
insert into tb values('a', 2, 'a2')
insert into tb values('a', 1, 'a1')
insert into tb values('a', 3, 'a3')
insert into tb values('b', 1, 'b1')
insert into tb values('b', 3, 'b3')
insert into tb values('b', 2, 'b2')
insert into tb values('b', 4, 'b4')
insert into tb values('b', 5, 'b5')
數據表如下:
name | val | memo |
a | 2 | a2 |
a | 1 | a1 |
a | 3 | a3 |
b | 1 | b1 |
b | 3 | b3 |
b | 2 | b2 |
b | 4 | b4 |
b | 5 | b5 |
按name分組取val最大的值所在行的數據
方法一:
select a.* from tb a where val = (select max(val) from tb where name = a.name) order by a.name
方法二:
select a.* from tb a where not exists(select 1 from tb where name = a.name and val > a.val)
方法三:
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
方法四:
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
方法五:
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 |
b | 5 | b5 |
小編推薦使用第一、第三、第四鍾方法,結果顯示第1,3,4種方法效率相同,第2,5種方法效率差些。
按name分組取val最小的值所在行的數據
方法一:
select a.* from tb a where val = (select min(val) from tb where name = a.name) order by a.name
方法二:
select a.* from tb a where not exists(select 1 from tb where name = a.name and val < a.val)
方法三:
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
方法四:
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
方法五:
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 |
b | 1 | b1 |
按name分組取第一次出現的行所在的數據
sql如下:
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 |
b | 1 | b1 |
按name分組隨機取一條數據
sql如下:
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 |
b | 3 | b3 |
按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 | 2 | a2 |
b | 1 | b1 |
b | 2 | b2 |
按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 desc) 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 | 3 | a3 |
a | 2 | a2 |
b | 5 | b5 |
b | 4 | b4 |