oracle 的keep用法及partition

语法:根据col3分组,col2排序,col1为 col2排序后的第一个/最后一个最大/最小值

min | max(column1keep(dense_rank first | last order by column2)over (partion by column3)




--keep 用法
drop table yu_test;
create table yu_test(id1 int ,id2 int,id3 int);
insert into yu_test(id1,id2,id3)
values(1,555,1);
insert into yu_test(id1,id2,id3)
values(1,555,2);
insert into yu_test(id1,id2,id3)
values(1,222,1);
insert into yu_test(id1,id2,id3)
values(1,333,2);
insert into yu_test(id1,id2,id3)
values(1,444,3);
 
insert into yu_test(id1,id2,id3)
values(2,669,1);
insert into yu_test(id1,id2,id3)
values(2,666,2);
insert into yu_test(id1,id2,id3)
values(2,777,3);
 
select  * from yu_test;


--需求1:找出每组id1中最小的id2
--方法1 传统group
select id1,min(id2)
 from yu_test aa group by aa.id1;


--方法2 分区函数+distinct 效率不高
select distinct aa.id1, min(id2) over(partition by aa.id1 order by  aa.id2)  rn
 from yu_test aa;
/* 错误写法select  aa.id1, min(id2) over(partition by aa.id1 order by  aa.id2)  rn
 from yu_test aa group by aa.id1;*/
 
--方法3 分区函数+row_number
select tt.id1,tt.id2 from (
select  aa.id1,aa.id2, row_number() over(partition by aa.id1 order by  aa.id2)  rn
 from yu_test aa)tt where  tt.rn=1;
 
--方法4 效率跟方法1是一样的
先了解下排序的3个函数
dense_rank函数在生成序号时是连续的(存在并列第一,1122),而rank函数生成的序号有可能不连续(跳号113)。
row_number()连续增长的(1234)


--dense_rank是固定写法(最佳)
select aa.id1,min(aa.id2) keep(dense_rank first order by aa.id2) from yu_test aa
group by aa.id1;
--或者
select distinct aa.id1,
       min(aa.id2) keep(dense_rank first order by aa.id2) over(partition by aa.id1)
  from yu_test aa;




--需求2: 按照id1分组 ,id3排序,取id3排序第一个的最小值
--方法1   根据id3排序,再根据id2排序
select tt.id1,tt.id2 from (
select  aa.id1,aa.id2, row_number() over(partition by aa.id1 order by  aa.id3,id2)  rn
 from yu_test aa)tt where  tt.rn=1;


--方法2 最佳
select aa.id1,min(aa.id2) keep(dense_rank first order by aa.id3) from yu_test aa
group by aa.id1;

有不对的还请指正,谢谢

猜你喜欢

转载自blog.csdn.net/u011165335/article/details/79318935