我正在编写一个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
功能创建类似的查询,还是应该创建其他查询?提前致谢
答案 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。