当前位置: 代码迷 >> Oracle开发 >> oracle按一字段分组后又选出另一字段出现频率最高的
  详细解决方案

oracle按一字段分组后又选出另一字段出现频率最高的

热度:254   发布时间:2016-04-24 06:23:33.0
oracle按一字段分组后再选出另一字段出现频率最高的
问题就是  按一字段分组后再选出另一字段出现频率最高的

我获取了  一个表  logs

  module     dept
    aa                01
    aa                01
    bb                02
    bb                01
    aa                03
    bb                02

我需要获取各个dept用得最多的module
------解决思路----------------------
with TT as (select moudel, dept, count(*) cc from logs group by moudel, dept)
select moudel, dept from TT where cc=(select max(cc) from TT) order by moudel;
------解决思路----------------------

-- 刚才写成 sqlserver 的语法了。今天不在状态。。。
SQL> create table logs(module varchar(10),dept varchar(10));
Table created
SQL> begin
  2  insert into logs values( 'aa', '01');
  3  insert into logs values( 'aa', '01');
  4  insert into logs values( 'bb', '02');
  5  insert into logs values( 'bb', '01');
  6  insert into logs values( 'aa', '03');
  7  insert into logs values( 'bb', '02');
  8  commit ;
  9  end;
 10  /
PL/SQL procedure successfully completed
SQL> select * from logs ;
MODULE     DEPT
---------- ----------
aa         01
aa         01
bb         02
bb         01
aa         03
bb         02
6 rows selected
SQL> /
MODULE     DEPT
---------- ----------
aa         01
aa         01
bb         02
bb         01
aa         03
bb         02
6 rows selected
SQL> with x as(
  2  select module, dept , COUNT(*) c from logs group by module , dept
  3  ),
  4   xx as(
  5  select x.* , RANK() over (order by x.c desc) rn from x
  6  )
  7  select module,dept from xx where rn = 1  ;
MODULE     DEPT
---------- ----------
aa         01
bb         02
SQL> /
MODULE     DEPT
---------- ----------
aa         01
bb         02
SQL> drop table logs purge ;
Table dropped

SQL> 


------解决思路----------------------
引用:

-- 刚才写成 sqlserver 的语法了。今天不在状态。。。
SQL> create table logs(module varchar(10),dept varchar(10));
Table created
SQL> begin
  2  insert into logs values( 'aa', '01');
  3  insert into logs values( 'aa', '01');
  4  insert into logs values( 'bb', '02');
  5  insert into logs values( 'bb', '01');
  6  insert into logs values( 'aa', '03');
  7  insert into logs values( 'bb', '02');
  8  commit ;
  9  end;
 10  /
PL/SQL procedure successfully completed
SQL> select * from logs ;
MODULE     DEPT
---------- ----------
aa         01
aa         01
bb         02
bb         01
aa         03
bb         02
6 rows selected
SQL> /
MODULE     DEPT
---------- ----------
aa         01
aa         01
bb         02
bb         01
aa         03
bb         02
6 rows selected
SQL> with x as(
  2  select module, dept , COUNT(*) c from logs group by module , dept
  3  ),
  4   xx as(
  5  select x.* , RANK() over (order by x.c desc) rn from x
  6  )
  7  select module,dept from xx where rn = 1  ;
MODULE     DEPT
---------- ----------
aa         01
bb         02
SQL> /
MODULE     DEPT
---------- ----------
aa         01
bb         02
SQL> drop table logs purge ;
Table dropped

SQL> 


引用版主,少了一个partition by dept 语句应该是下面这个。
 with x as(
    select module, dept , COUNT(*) c from logs group by module , dept
    ),
    xx as(
    select x.* , RANK() over (partition by dept order by x.c desc) rn from x
    )
    select module,dept from xx where rn = 1  ; 

------解决思路----------------------
SELECT t1.dept,
       t2.mod
       FROM
(SELECT dept,
       MAX(NUM) NUM
FROM
(SELECT dept,
       MOD,
       COUNT(*) NUM
FROM logs
GROUP BY dept,MOD)t
GROUP BY dept)t1
LEFT JOIN
(SELECT dept,
       MOD,
       COUNT(*) NUM
FROM logs
GROUP BY dept,MOD)t2
ON t1.dept=t2.dept
AND t1.num=t2.num
ORDER BY t1.dept DESC
  相关解决方案