ORACLE中如何从表中查出某个字段相同值最多的前三个

比如说一张表中,某个字段A有10个为B,8个为C,7个为D,5个为E,那么导出出现次数最多的前三个为:BCD。求教方法,谢谢

oracle中sql不可以查询出某字段相同值最多的字段。涉及到业务逻辑筛选了。
1、查询某字段的值,对比如果相同保存起来
2、继续查询,如果有相同值则继续保存
3、对比集合中的数,如果相同最多,把id取出来查询即可。
温馨提示:内容为网友见解,仅供参考
第1个回答  2015-11-04

思路步骤:

    先统计该字段每个值出现的次数;

    通过ROWNUM或者RANK函数获取出现次数最多的3个值;

SQL:

SELECT COL,T_COUNT
FROM   (SELECT COL, COUNT(1) AS T_COUNT
         FROM   TABLE1
         GROUP  BY COL
         ORDER  BY T_COUNT DESC)
WHERE  ROWNUM <= 3

第2个回答  2015-03-26
按照字段A进行分组,使用group by
统计的时候使用排名函数,比如rank()
获取rank()函数的值<=3就可以啦
自己尝试一下吧追问

可是你这样获取的是最大值的前三个吧? 我需要的是出现次数最多的前三个。
select * from (select * from audit_ErrFailCDRs_monitor order by to_number(RESULTCODE) desc) where rownum <=3
这样得出的是最大的前三个,而我现在想得到RESULTCODE这个字段的值出现最多的前三个

追答

使用排名函数的条件就是按照次数统计的。所以最大值的前三个就 是出现次数最多的前三

本回答被网友采纳
第3个回答  2015-03-26
select ch.a from ( select rownum r ,COUNT(t.A),t.A a ct from TABLE t group by t.A order by ct desc) ch where ch.r<3;追问

好像看不懂耶。
select * from (select * from audit_ErrFailCDRs_monitor order by to_number(RESULTCODE) desc) where rownum <=3; 这个就是我要查询的表,但是我这样只能得到最大值的前三个,而现在想得到的是RESULTCODE这个字段的值出现最多的前三个,求帮助

追答

SELECT
ch.a
FROM
(
SELECT
rownum r,
COUNT(t.RESULTCODE) ct,
t.RESULTCODE a
FROM
audit_ErrFailCDRs_monitor t
GROUP BY
t.RESULTCODE
ORDER BY
ct DESC
) ch
WHERE
ch.r <= 3;
内层语句中用RESULTCODE进行分组,拿到个数COUNT(t.RESULTCODE) ct,并且按个数倒序排序。同时加上rownum r字段得到子表ch。
外层查询拿到前三个,就是出现次数前三的。

追问

我用PL/SQL 运行你的代码。好像不能运行也。
表:audit_ErrFailCDRs_monitor 字段;RESULTCODE

而且好像取别名要用as吧,看你都没有。
大神,求详细解答步骤,我还是个菜鸟哦!

追答

去别名用as | is都可,也可以省略,加个空格然后别名就行。
用RESULTCODE进行分组,

分组后能拿到每组的个数:COUNT(t.RESULTCODE) ct

然后通过个数倒序排序。
然后拿前三个就行。

追问

你说的是SQL吧,为什么我用PL/SQL运行你的代码会报错呢?  你运行后是什么结果?

追答

是sql语句,你说的PL/SQL是数据库工具。能运行的。我这里没有你的表结构,所以没有运行

本回答被提问者采纳
相似回答