作者Antzzz (减肥中请勿喂食)
看板Database
标题Re: [SQL ] 如何找出频率最高的查询一问
时间Mon Feb 4 18:23:38 2008
※ 引述《fantasywater (狂想)》之铭言:
: +------+--------+ 如左表
: | dno | salary | 请问:要找出每一个dno里面薪水出现频率最多
: +------+--------+ 得查询应该要怎麽写?
: | 5 | 30000 |
: | 5 | 25000 | 我只会列出每一个dno里面最高最低和频均的薪水
: | 5 | 25000 | 不知道如果要先计算出现频率,
: | 5 | 38000 | 再把频率最高的结果抓出来的查询怎麽写
: | 1 | 55000 |
: | 4 | 43000 |
: | 4 | 25000 |
: | 4 | 25000 |
: +------+--------+
: +------+--------+ 左边这个是我希望得到的结果
: | dno | salary | MYSQL或是标准SQL里面有可以计算出现频率最多的方法吗?
: +------+--------+
: | 5 | 25000 |
: | 1 | 55000 |
: | 4 | 25000 |
: +------+--------+
众数可能会回传多笔
如果只需取一笔(最大或最小,平圴好像没什麽意义…)
可以用函数来做:
create function fn_ModeSalery(int dno)
回传salary
这样可以用之前文章中的top 1、count加上order by count(*),salary很简单地做出来
然後把这个函数写在select list中
通常这样就可以符合大部份需求了
要让它可以回传多笔的话
只好写在join table里
先计算dno,salary的个数
再取最大值(不能用max(count(*))真是麻烦)
再用原来的Table和最大值表join起来,在having叙述式中让count相等
具体而言就是
select employee.dno, employee.Salary
from employee
inner join(
select dno, max(Cou) as MaxCount
from(
select dno, count(*) as Cou
from employee
group by dno, Salary
) A
group by dno
) B on employee.dno = B.dno
group by employee.dno, employee.Salary, B.MaxCount
having count(*) = B.MaxCount
这样同一个dno可能会回传两笔哦
就我所知大部份的人好像都不希望这样…
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 211.20.100.62
※ 编辑: Antzzz 来自: 211.20.100.62 (02/04 18:25)
1F:推 fantasywater:感谢回答,验证过後是正确的,我确实没有要求平均.. 02/05 00:12