我有一些记录显示用户的工资和部门。 我想知道排名及其差异。
SELECT depname, empno, salary, rank() OVER (PARTITION BY depname ORDER BY salary DESC) FROM empsalary;
depname | empno | salary | rank
-----------+-------+--------+------
develop | 8 | 6000 | 1
develop | 10 | 5200 | 2
develop | 11 | 5200 | 2
develop | 9 | 4500 | 4
develop | 7 | 4200 | 5
personnel | 2 | 3900 | 1
personnel | 5 | 3500 | 2
sales | 1 | 5000 | 1
sales | 4 | 4800 | 2
sales | 3 | 4800 | 2
我想知道每个职级薪水的差异
depname | empno | salary | rank | diff
-----------+-------+--------+------+------
develop | 8 | 6000 | 1 | 800
develop | 10 | 5200 | 2 | 700
develop | 11 | 5200 | 2 | 700
develop | 9 | 4500 | 4 | 300
develop | 7 | 4200 | 5 |
personnel | 2 | 3900 | 1 | 400
personnel | 5 | 3500 | 2 |
sales | 1 | 5000 | 1 | 200
sales | 4 | 4800 | 2 |
sales | 3 | 4800 | 2 |
教我上面返回的查询。
答案 0 :(得分:2)
只需使用lag()
:
SELECT depname, empno, salary,
rank() OVER (PARTITION BY depname ORDER BY salary DESC) as rnk,
(salary - lag(salary) over (partition by depname order by salary desc)) as diff
FROM empsalary;
编辑:
我注意到您的数据有重复 - 因此rank()
。这有点麻烦,因为Postgres不支持完整的range
关键字。这是一种不使用JOIN
的方法:
SELECT depname, empno, salary, rnk,
(salary - MIN(prev_salary) OVER (PARTITION BY depname, rnk)) as diff
FROM (SELECT depname, empno, salary,
rank() OVER (PARTITION BY depname ORDER BY salary DESC) as rnk,
lag(salary) over (partition by depname order by salary desc) as prev_salary
FROM empsalary
) e;
答案 1 :(得分:0)
SELECT depname,empno, salary, rank()
OVER (PARTITION BY depname ORDER BY salary DESC) AS rnk, salary-lag(salary)
OVER (partition BY depname ORDER BY salary ) AS diff
FROM empsalary ORDER BY depname, salary DESC;