Sql 带秩的postgres窗口函数
我有一些显示用户工资和部门的记录。 我想知道排名和它的区别Sql 带秩的postgres窗口函数,sql,postgresql,window-functions,Sql,Postgresql,Window Functions,我有一些显示用户工资和部门的记录。 我想知道排名和它的区别 SELECT depname, empno, salary, rank() OVER (PARTITION BY depname ORDER BY salary DESC) FROM empsalary; depname | empno | salary | rank -----------+-------+--------+------ develop | 8 | 6000 | 1 develop
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 |
教我上面返回的查询。只需使用lag()
:
编辑:
我注意到您的数据有重复项,因此使用了rank()
。这有点麻烦,因为Postgres不支持完整的范围
关键字。这里有一个不使用联接的方法:
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;
您好,请尝试回答mo12mo34问题;-)请对此添加一些解释,以便人们了解为什么薪酬滞后(salary lag)会因部门名称而产生薪酬差异。这可能会回答以下问题:仅包含代码但未说明代码如何工作的答案可能会被标记为低质量。考虑添加一段文本来解释代码,这可能有助于OP和未来的访问者访问这篇文章。同样,这样,你更有可能在这个问题上获得分数。
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;
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;