oracle sql语句相关问题,分组后查询。

有一张表(t),字段 a,b,c,d
通过d字段分组统计次数最多的前5个数据
并且显示a,b,c,d全字段。

selct a,b,c,d form t where rownum<=5
selct count(*) as top5 form t group by d order by top5
就是这两语句该怎么整成一个sql语句

首先,你提的问题有些疑惑,你要d字段统级次数最多的前5个数据,照你这句话,查询出来的结果集应该是大于等于5行数据的.比如
select * from (

selct d,count(1) as top5 form t group by d order by top5 desc) a

where rownum<=5。查出的结果集可能为:
d top5
x 10
y 9
z 8
p 7
q 6
表示t.d=x的数据有10条,t.y=y的数据有9条。然后你是取出t.d=x的前5条,还是说把这40条记录全部取出来?追问

我最终想要的是
x 10 我只要1条,以此类推。

a,b,c,d == x(1条)
a,b,c,d == y(1条)
a,b,c,d == z(1条)
a,b,c,d == p(1条)
a,b,c,d == q(1条)
最终只要5条。

追答

哦哦,我的方法是先group分组获得次数最大的5个d,然后在用rank()over()函数,在这5个d内分组排序,取出第一条

select a,b,c,d,rank() over(partition by d order by d desc) as rk

from (
select * from t where d in (
select d from (
select d,count(1) as top5 from t group by d order by count(1)desc
)

where rownum<=5
)
) where rk=1;
由于每组的d的值是相同的,所以你的结果集取决于t表结构的默认a,b,c字段的排序情况

追问

为什么rk 获取不到呢,多谢意见哦。

追答

select a,b,c,d,rank() over(partition by d order by a desc) as rk
from (
select * from t where d in (
select d from (
select d,count(1) as top5 from t group by d order by count(1)desc
) t1
where rownum<=5
) t2
) t3

where rk=1;
这样试试,注意,partition by d order by a 的意思是按d分组,按a排序。

温馨提示:内容为网友见解,仅供参考
第1个回答  2015-11-05
select a,b,c,d from t where t.d in (
select t2.d from (

select d, count(*) as top5 from t group by d order by top5 desc

) t2

)

oracle sql语句相关问题,分组后查询。
首先,你提的问题有些疑惑,你要d字段统级次数最多的前5个数据,照你这句话,查询出来的结果集应该是大于等于5行数据的.比如 select * from (selct d,count(1) as top5 form t group by d order by top5 desc) a where rownum<=5。查出的结果集可能为:d top5 x 10 y 9 z...

Oracle,SQL语句中对错误提示:不是单组分组函数的
在Oracle和SQL语句中,当执行如下的查询:sql SELECT deptno, MAX(count(*))FROM emp GROUP BY deptno 实际上,这里的 `MAX(count(*))` 实际上是进行了两次分组操作。第一次是对 `deptno` 进行分组,第二次是对每个部门内的所有记录计数。这可能导致误解,因为 `max()` 函数通常用于单个分组结果...

Oracle按部门分组,查询max(avg(sal))结果显示两列,部门编号max(avg(s...
兄弟,你的sql语句有问题,如果你想要显示两列,一个是部门编号,一个是最大的部门平均工资,这样的话,数据只可能有一行两列,你可以这样写:select e.deptno,round(avg(e.sal),2)from emp e group by e.deptno having round(avg(e.sal),2) = (select max(round(avg(e.sal),2))from emp...

oracle sql查询完成分组并只返回每组的最小最大值
楼主把上面语句里的3换成100就行了。

oracle,sql分组问题,求助
你这样根本就无法分组,除非F1每组的“AA”、“BB”值不一样,比如下面这样的数据,则可以按你的要求进行分组。我的实际DB不一样,对比如下:T=a_lmo_temp F1=id1 F2=id2 查询SQL如下:SELECT A1.ID1 AS F1,A1.ID2 AS F2,A2.NUMS AS F3 FROM A_LMO_TEMP A1 INNER JOIN (SELECT ID1...

Oracle,SQL语句中对错误提示:不是单组分组函数的一个疑问
select deptno,max(count(*)) from emp group by deptno 其中max(count(*))相当于2次分组,那么对应的select 中的其他列也需要进行2次分组,比如说:select max(deptno),max(count(*)) from emp group by deptno 原因很简单,sql语言就面向集合的,如果求出来max(count(*)),那么deptno需要对应...

分组查询后再怎样按条件查询
sql多条件分组查询举例:比如有两张表:表一:姓名 分数———李一 2李二 1李三 1张一 3张二 2张三 2……表二:姓——李张王要查询表二中的姓的数据对表一进行分组,然后将分数统计出来。sql语句写法如下:SELECT b. NAME, sum(a.score) AS 分数FROM tb1 aLEFT JOIN tb...

oracle 求sql语句 按照日期范围分组查询。请务必写出测试过的代码,有难...
问了你半天也不答,按startdate的时间为准了 --建表如下 create table test(startdate date,enddate date,autualdate date,"desc" varchar2(10),"value" int)--插入数据 insert into test values (to_date('2013-05-17','yyyy-mm-dd'),to_date('2013-05-17','yyyy-mm-dd'),to_date(...

sql多条件分组查询,求sql语句。
——李 张 王 要查询表二中的姓的数据对表一进行分组,然后将分数统计出来。sql语句写法如下:SELECT b. NAME,sum(a.score) AS 分数 FROM tb1 a LEFT JOIN tb2 b ON SUBSTR(a.name FROM 1 FOR 1)= b.`name`GROUP BY b. NAME;这个是Mysql的写法 Oracle把SubStr函数改一下就可以了。

(oracle)sql根据某一字段分组求和后再列出其他字段信息
acd一样的话,可以select a,c,d,sum(b) from table group by a,c,d;除了ab字段外,取c一条记录 select a,c,sum(b) from where c = '你要的c' table group by a,c;

相似回答