>  기사  >  데이터 베이스  >  Oracle row_number分析函数简化了我们的很多操作

Oracle row_number分析函数简化了我们的很多操作

WBOY
WBOY원래의
2016-06-07 17:01:02831검색

18802 13009060195 9 18830 13009063333 7 //分析: //这不是一个很难的问题, /*********分组统计***

Oracle row_number分析函数简化了我们的很多操作

[日期:2011-05-04] 来源:Linux社区  作者:BOBO12082119 [字体:]

//问题:  
CI  MSISDN      CNT  
18802   13009060195 9  
18830   13009060195 1  
18837   13009060195 2  
18829   13009063333 5  
18830   13009063333 7  
18847   13009063333 4  
//结果:  
CI  MSISDN      CNT  
18802   13009060195 9  
18830   13009063333 7  
//此问题是想把MSISDN相同的项的CNT查询出来  
//碰到此问题,我是这么思考的:  
//首先,将MSISDN相同的项的CNT查询出来,构成一个结果集:  
with t as(  
     select '18802' ci,'13009060195' msisdn,9 cnt from dual union all  
     select '18830','13009060195',1 from dual union all  
     select '18837','13009060195',2 from dual union all  
     select '18829','13009063333',5 from dual union all  
     select '18830','13009063333',7 from dual union all  
     select '18847','13009063333',4 from dual)  
select msisdn,max(cnt) cnt  
from t  
group by msisdn  
--  
MSISDN             CNT  
----------- ----------  
13009060195          9  
13009063333          7  
//其次,将原表与此结构集相匹配,如果MSISDN和CNT都相同的就提出来  
select t.*  
from t,(  
     select msisdn,max(cnt) cnt  
     from t  
     group by msisdn  
     ) b  
where t.msisdn=b.msisdn and   
      t.cnt=b.cnt;  
//这样就能得到我们想要的结果,如下:  
CI    MSISDN             CNT  
----- ----------- ----------  
18802 13009060195          9  
18830 13009063333          7  
//分析:  
//这不是一个很难的问题,,  
/*********分组统计******/ 
//可这又是子查询,又是表连接的,怎么那么费事呢?  
//肯定还有更好的解决方法:  
select ci,msisdn,cnt   
from (select ci,  
             msisdn,  
             cnt,  
             row_number()over(partition by msisdn order by cnt desc) rn from t)  
where rn=1; 

linux

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.