我有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个数据值的部门来获取值。
此后有人可以帮助解决这个问题吗?
非常感谢您的帮助。
答案 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在查询本身中完成子查询。我希望我能有所帮助。