2 zhuazhuqingchong zhuazhuqingchong 于 2015.07.22 23:23 提问

数据库,求最小 group ,count,min 2C

在Table中,我需要查出那个ID出现的频率最小,
select count(c1) from table where id=1,
select count(c1) from table where id=2
select count(c1) from table where id=3
select count(c1) from table where id=4,
最后查出来的结果理想是
0
1
2
3
不知道有没有好一点的思路,不想在代码里做个傻循环,需要注意的是ID可能为空
即select * from table where id=1有可能无结果集

14个回答

caozhy
caozhy   Ds   Rxr 2015.07.22 23:25

select count(c1) as xx from table group by id order by xx

zhuazhuqingchong
zhuazhuqingchong 忘记补充一句,ID数目是在一定范围的 楼上,注意我想要的结果了么,
2 年多之前 回复
zhuazhuqingchong
zhuazhuqingchong   2015.07.22 23:27

忘记补充一句,ID数目是在一定范围的
楼上,注意我想要的结果了么,

oyljerry
oyljerry   Ds   Rxr 2015.07.22 23:34

select count(c1) as num from table group by id having id in (1,2,3,4) order by num

zhuazhuqingchong
zhuazhuqingchong 3楼,不知道你有亲自试过么,如果1在table中不存在呢,再说我想要的是出现次数最少的ID,可能描述有部分错误
2 年多之前 回复
zhuazhuqingchong
zhuazhuqingchong   2015.07.22 23:47

@3楼,不知道你有亲自试过么,如果1在table中不存在呢,再说我想要的是出现次数最少的ID,可能描述有部分错误

caozhy
caozhy   Ds   Rxr 2015.07.22 23:47

http://bbs.csdn.net/topics/330092271
产生了数字,然后outer join

zhuazhuqingchong
zhuazhuqingchong 能再详细点儿么,我怎么不太明白
2 年多之前 回复
sinat_21703099
sinat_21703099   2015.07.23 01:30

select id from(select id,count(c1) as num from table where id in(1,2,3,4) group by id)group by id having num=min(num)

zhuazhuqingchong
zhuazhuqingchong 如果1不在表中呢,2,3,4都存在,这时用这个语句肯定得不到1的,而1在此表中没有出现,理论上来讲他应该是最小的
2 年多之前 回复
zhuazhuqingchong
zhuazhuqingchong 如果1不在表中呢,2,3,4都存在,这时用这个语句肯定得不到1的,而1在此表中没有出现,理论上来讲他应该是最小的
2 年多之前 回复
herl1988
herl1988   2015.07.23 06:25

还是count,group by,having那几个东西,自己多试几次就出来了

qq_25409579
qq_25409579   2015.07.23 08:43

这种查询的话你可以用类似桶排序的办法,你要取Id为1 2 3 4 的出现次数的话,
创建一个长度为4的数组 初始值都为0,a[0]到a[3]分别代表id1234出现的次数。
遍历表,出现id=1的话a[0]+=1…其余的也一样,最后输出数组元素就是相应ID出现的次数了

Evankaka
Evankaka   Ds   Rxr 2015.07.23 08:48

select id,count(c1) from table group by id

qq_25265293
qq_25265293   2015.07.23 11:07

你的意思是id范围是固定的集合,比如1、2、3、4、5,在table里可能某个id是不存在的,那么这个id出现的次数就是0,也就是最小的;
如果都出现,那么就是取最小的那个,是这样的意思吧?
假设你的id范围是0,1,2,3,4,5,表里的次数分别是
id,cs
0,8
1,9
3,7
5,8
其中2,4是0次。

select id from (
with t_id as
(select substr(t.ca,instr(t.ca,',',1,c.lv)+1,instr(t.ca,',',1,c.lv+1)-(instr(t.ca,',',1,c.lv)+1)) as id
from (select ',0,1,2,3,4,5,' as ca,length(',0,1,2,3,4,5,')-nvl(length(replace(',0,1,2,3,4,5,',',')),0)-1 as cnt from dual) t,
(select level lv from dual connect by level<=10) c
where c.lv<=t.cnt)
,t_cs as
(select id,sum(cs) cs from tmp_t group by id)
select t_id.id,rank() over (order by nvl(t_cs.cs,0)) rk from t_id,t_cs where t_id.id=t_cs.id(+))
where rk=1

结果是2,4

解释一下:
t_id,是把你的id范围0,1,2,3,4,5,转换成一个6行的临时表;如果你的id范围是从其他表里来的,那么直接select distinct id from id范围表 就可以了
t_cs,是table表里根据id分组统计的出现次数

外链接t_id.id=t_cs.id(+),把数值范围取全,配合nvl(t_cs.cs,0),如果没有出现,次数就=0
rank是排名,次数出现小的排第一,这里有2个数字次数都是0,并列第一,rank都是1,所以都取出来了,如果只要任取一个,把rank改为row_number就可以了

qq_25265293
qq_25265293 忘记说了,这个sql大概只在oracle里有效。。。
2 年多之前 回复
共14条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片