2016-12-22 11 views
2

ユーザーの給与と部門を示すレコードがあります。 ランキングとその差分を知りたいです。ポストグルウィンドウ機能ランク

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 

Iは、それぞれの違いは給料

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 | 

は私に上記返すクエリを教えるランク知りたいのです。

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:

答えて

2

だけlag()使用

を私はあなたのデータが重複していることに気づいた - それゆえ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

給与・ラグ(給与の作品、なぜ人々は学ぶことができるので、これにいくつかの説明を追加してください。 )得意先名で給与に差異を与えます – Claudio