SQL中的多数函数

时间:2014-03-20 12:38:09

标签: sql plsql group-by oracle-sqldeveloper

我正在编写一个SQL命令来查找表中的大部分值(如果表中的值大于50%,则返回多数值)。对于例如一个Emp(姓名,年龄,部门) 表中的值:(32,33,45,45,45 21,45)

因此,如果用户希望获得字段年龄的多数值,他将运行命令:

SELECT majority(age) FROM Emp

现在在后端生成的相应SQL命令将如下:

SELECT age FROM Emp GROUP BY age HAVING COUNT(*) > ((SELECT COUNT(*) FROM Emp) / 2);

此查询返回45作为结果。

但是对于用户查询,例如:

SELECT majority(age), dept FROM Emp GROUP BY dept

然后我不确定如何使用group by功能创建类似的查询,还是应该创建其他查询?提前致谢

2 个答案:

答案 0 :(得分:4)

(假设您使用的是Oracle - 因为在MySQL中您无法编写自己的聚合)

我认为您可以使用窗口函数执行此操作:

这相当于第一个例子:

select distinct age
from (
  select age, 
         dept,
         count(*) over () as total_count, 
         count(*) over (partition by age) as age_count
  from emp
) 
where age_count >= total_count / 2;

只需将部门添加到分区(组)定义中,就可以得到您想要的内容:

select distinct age
from (
  select age, 
         dept,
         count(*) over (partition by dept) as dept_count, 
         count(*) over (partition by dept, age) as age_count
  from emp
) 
where age_count >= dept_count / 2;

答案 1 :(得分:1)

您要求执行的操作称为创建用户定义的聚合函数。这不是一个微不足道的任务,但这是在Oracle中这样做的一个tutuorial。

User-defined aggregate functions in oracle 9i