2016-12-22 3 views
2

У меня есть записи, которые показывают пользователям зарплату и отдел. Я хотел бы знать рейтинг и его разницу.postgres window функция с рейтингом

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 | 

научить меня запрос, который возвращает выше.

ответ

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; 

EDIT:

Я заметил, что ваши данные Повторяющиеся - отсюда 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; 
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; 
+0

привет попытаться ответить на вопрос mo12mo34 ;-) – Claudio

+3

Пожалуйста, добавьте некоторые пояснения к этому, чтобы люди могли узнать, почему это работает – hardillb

+0

зарплаты лаг (зарплата) дает разницу в зарплате от depname – Claudio

Смежные вопросы