我正在编写一个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功能创建类似的查询,还是应该创建其他查询?提前致谢
group by
(假设您使用的是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;