查找同一部门ID的上一行和当前行的平均值

时间:2019-01-23 13:17:52

标签: sql oracle

我有3名员工和同一部门。我想根据前几行找到他们的平均工资。

例如

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

这类似于部门ID为1且首次薪水的员工ID为101的平均值,对于与部门ID相同的ID为1的雇员ID 102的平均值,我们找到了按部门分组的2个值的平均值ID。 因此 平均为(10000 + 5000)/ 2 = 7500

但是对于雇员ID为103的部门,ID为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 :(得分:2)

使用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

db <>提琴here

答案 1 :(得分:0)

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

可以通过过滤员工ID在查询本身中完成子查询。我希望我能有所帮助。

相关问题