Аналитическая функция Oracle с группировкой по - PullRequest
0 голосов
/ 28 июня 2018

Обычно мы делаем группу по имени dept_name и находим максимальную и минимальную зарплату.

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

Но как я могу найти имя сотрудника (ов), который получает максимальную и минимальную зарплату. Можно ли найти в одном выражении SQL?

Ответы [ 3 ]

0 голосов
/ 28 июня 2018

Вы можете сделать что-то вроде

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, поэтому я использовал EMP_NAME. Если имя столбца отличается от этого, вам нужно изменить запрос, чтобы использовать правильное имя столбца.

Удачи.

0 голосов
/ 28 июня 2018

Вы можете использовать функцию FIRST :

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;

Обратите внимание: если у вас более одного сотрудника с одинаковой зарплатой, вы получаете только одного из них.

В зависимости от ваших требований вы также можете использовать Pattern Matching

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)
);
0 голосов
/ 28 июня 2018

Вы можете сделать это с помощью подзапроса:

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