这在 MySQL 而不是 Oracle 中起作用的原因是,在 Oracle 以及大多数其他数据库中,您要么需要在group by
子句中指定一个字段(或表达式),要么它必须是一个结合了以下值的聚合组中的所有值合并为一个。例如,这将起作用:
select max(emp_name),emp_location
from Employee
where emp_age=25
group by emp_location
但是,它可能不是最好的解决方案。如果您只想要名称,它会起作用,但是当您想要为员工提供多个字段时,您会遇到麻烦。在这种情况下max
不会成功。在下面的查询中,您可能会得到与姓氏不匹配的名字。
select max(emp_firstname), max(emp_lastname), emp_location
from Employee
where emp_age=25
group by emp_location
对此的解决方案是使用窗口函数(分析函数)。有了这些,您可以为每条记录生成一个值,而无需立即减少记录数。例如,使用窗口max
函数,您可以为名为 的人选择最大年龄John
,并在结果中的每个 John 旁边显示该值,即使他们没有那个年龄。
一些函数,如和 ,rank
可用于为每个员工生成一个编号,然后您可以使用该编号进行过滤。在下面的示例中,我为每个位置(按分区)创建了一个计数器,并按此例中的名称和 ID 排序。您也可以指定其他字段,例如,如果您希望每个位置每个年龄一个名称,您可以在 中同时指定年龄和位置。如果您想要每个位置的最年长员工,您可以删除and代替。dense_rank
row_number
partition by
where emp_age=25
order by emp_age desc
select
*
from
(select
emp_name, emp_location,
dense_rank() over (partition by emp_location order by emp_name, emp_id) as emp_rank
from Employee
where emp_age=25)
where
emp_rank = 1