一尘不染

SQL中的多数功能

sql

我正在编写一个SQL命令以查找表中的多数值(如果值在表中的出现率大于50%,则该值将作为多数返回)。例如,对于具有表中的值的Emp(name,age,dept):(32,33,45,45,4521,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功能创建类似的查询,还是应该创建其他查询?提前致谢


阅读 143

收藏
2021-05-30

共1个答案

一尘不染

(假设您使用的是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;
2021-05-30