Найти среднее значение из предыдущей строки и текущей строки для того же идентификатора отдела - PullRequest
0 голосов
/ 23 января 2019

У меня 3 сотрудника с одинаковыми отделами.я хотел бы найти среднее значение их зарплаты на основе предыдущих строк.

Например,

Employee_id  department_id salary   avg(salary)
101             1           5000      5000
102             1           10000     7500
103             1           15000     10000 

Это похоже на идентификатор отдела, равный 1, с первой зарплатой, мы находим среднее значение 5000 дляидентификатор сотрудника 101 и для того же идентификатора отдела как 1 для идентификатора сотрудника как 102, мы находим среднее для двух значений, сгруппированных по идентификатору отдела.Следовательно, среднее значение равно (10000 + 5000) / 2 = 7500

Но для идентификатора сотрудника, равного 103, идентификатор отдела равен 1 и сгруппирован со всеми тремя вышеуказанными значениями суммы.Следовательно, средняя зарплата составляет (10000 + 5000 + 15000) / 3 = 10000

Требование: меня попросили использовать query_partition_clause и order_by_clause.

Следовательно, я попытался следующим образом,

 select  avg(salary) OVER (partition by department_id ORDER BY department_id ) salary, department_id, salary from employee

Но я всегда получаю значения, рассматривая отдел из 3 значений данных.

Отныне кто-нибудь может помочь с этим разрешением?

Большое спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 23 января 2019
SELECT EMPLOYEE_ID, 
       DEPARTMENT_ID, 
       SALARY, 
       (SELECT AVG(SALARY) 
          FROM EMPLOYEES B 
         WHERE B.EMPLOYEE_ID <= A.EMPLOYEE_ID) AVG_SALARY
  FROM EMPLOYEES A
 GROUP BY EMPLOYEE_ID, 
          DEPARTMENT_ID, 
          SALARY

Подзапрос может быть выполнен в самом запросе путем фильтрации идентификатора сотрудника.Надеюсь, я чем-то помог.

0 голосов
/ 23 января 2019

Используйте ORDER BY salary (или ORDER BY employee_id) вместо ORDER BY department_id:

Установка Oracle :

CREATE TABLE employees ( Employee_id, department_id, salary ) AS
SELECT 101, 1,  5000 FROM DUAL UNION ALL
SELECT 102, 1, 10000 FROM DUAL UNION ALL
SELECT 103, 1, 15000 FROM DUAL;

Запрос :

SELECT e.*,
       AVG( salary ) OVER ( PARTITION BY department_id ORDER BY salary ) AS avg_salary
FROM   employees e

Выход :

EMPLOYEE_ID | DEPARTMENT_ID | SALARY | AVG_SALARY
----------: | ------------: | -----: | ---------:
        101 |             1 |   5000 |       5000
        102 |             1 |  10000 |       7500
        103 |             1 |  15000 |      10000

дБ <> скрипка здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...