具有group by的Oracle分析函数

具有group by的Oracle分析函数,oracle,oracle11g,oracle10g,Oracle,Oracle11g,Oracle10g,通常情况下,我们是按部门名称分组,查找最高和最低工资 select dept_name,sum(salary),max(salary).min(salary) from emp group by dept_name; 但是我如何才能找到获得最高工资和最低工资的员工的姓名。是否可以在单个sql语句中查找?您可以借助子查询来完成此操作: select emp_name from employee where salary = (select max(salary) from employee)

通常情况下,我们是按部门名称分组,查找最高和最低工资

select dept_name,sum(salary),max(salary).min(salary) from emp group by dept_name;

但是我如何才能找到获得最高工资和最低工资的员工的姓名。是否可以在单个sql语句中查找?

您可以借助子查询来完成此操作:

select emp_name from employee where salary = (select max(salary) from employee) 
or salary = (select min(salary) from employee) ;

你可以这样做

WITH cteDepts as (select dept_name,
                         sum(salary) AS TOTAL_SALARY,
                         max(salary) AS MIN_SALARY,
                         min(salary) AS MAX_SALARY
                    from emp
                    group by dept_name)
SELECT d.*, emin.EMP_NAME, emax.EMP_NAME
  FROM cteDepts d
  INNER JOIN EMP emin
    ON emin.SALARY = d.MIN_SALARY
  INNER JOIN EMP emax
    ON emax.SALARY = d.MAX_SALARY
我不知道EMP表中的employee name列是什么,所以我使用了
EMP\u name
。如果列名与此不同,则需要更改查询以使用正确的列名

祝您好运。

您可以使用以下功能:

SELECT dept_name, SUM(salary), MAX(salary), MIN(salary),
    MAX(emp_name) KEEP (DENSE_RANK FIRST ORDER BY salary) AS Min_salary_emp,
    MAX(emp_name) KEEP (DENSE_RANK LAST ORDER BY salary) as  Max_salary_emp 
FROM emp 
GROUP BY dept_name;
请注意,如果您有多个员工具有相同的工资,您只能得到其中一个

根据您的要求,您也可以使用


@Wernfired Domscheit:太好了。。谢谢。。如期工作
SELECT dept_name, MAX_salary, MIN_salary, salary, emp_name,
    Min_salary_emp, Max_salary_emp
FROM emp
MATCH_RECOGNIZE (
    PARTITION BY dept_name
    ORDER BY salary
    MEASURES 
        FINAL MIN(salary) AS MIN_salary,
        FINAL MAX(salary) AS MAX_salary,
        a.emp_name AS Min_salary_emp,
        c.emp_name AS Max_salary_emp
    ALL ROWS PER MATCH
    PATTERN ( (a+ {- b* -} c+) | a )
    DEFINE
    a AS salary = MIN(salary),
    c AS salary = MAX(salary)
);