mysql和oracle数据库分组查询前N条数据,最大值和最小值

首先我们创建一个表tb然后插入数据
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’)

mysql数据库
A.按name分组查询val最大值和最小值
1.取最大值
第一种方法
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 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

2.取最小值
第一种方法
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

B.按name分组取前N条数据
1.按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
第二种方法(此种是sqlserver用法)
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

2.按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
第二种方法(此种是sqlserver用法)
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

oracle数据库
A.按name分组查询val最大值和最小值
1.取最大值
第一种方法
select t.* from tb t where val = (select max(val) from tb where name = t.name) order by t.name
第二种方法
select a.* from tb a where not exists(select 1 from tb b where b.name = a.name and b.val > a.val)
第三种方法
select * from (select A.*,row_number() over(partition by name order by val desc) aa from tb A) b where b.aa = 1

2.取最小值
第一种方法
select t.* from tb t where val = (select min(val) from tb where name = t.name) order by t.name
第二种方法
select a.* from tb a where not exists(select 1 from tb b where b.name = a.name and b.val < a.val)
第三种方法
select * from (select A.*,row_number() over(partition by name order by val asc) aa from tb A) b where b.aa = 1

B.按name分组取前N条数据
1.按name分组取最小的两个(N个)val
select * from (select A.*,row_number() over(partition by name order by val asc) aa from tb A) b where b.aa <= 2

2.按name分组取最大的两个(N个)val
select * from (select A.*,row_number() over(partition by name order by val desc) aa from tb A) b where b.aa <= 2

你可能感兴趣的:(数据库)