2017-12-13 19 views
0

問題にスタックされているビット。 postgreSQLの2つの日付の違いを調べようとしています。特定の従業員の最大日付と最後から2番目の最大値の差 - postgresql

私はそれで多くの従業員を持つemp表を持っている:

emp_id, date 

1, 31-10-2017 

1, 08-08-2017 

1, 02-06-2017 

私はそれが次のようになりたい:

emp_id, max_date, penultimate_date, difference 

1, 31-10-2017, 08-08-2017, 84 days 

明らかに、あなたは何がどのように、max(date)group byemp_idを使用することができます最後から2番目の日付を取得します。そこに多くの従業員番号があると、私は、各従業員のために1行を必要とするように私はまた、サブクエリでこれらを置くことを試みているが、そのhasn、tは働い

order by date desc limit 1 offset 1 

:私のようないくつかの関数を使用していました。

誰でも手伝いますか?

おかげで、

pp84

など親切に@Haleemurアリによって提案

答えて

1

は、order by date desc limit 1 offset 1は、いくつかのEMP_IDでは動作しません :降順で、LEAD("date") wがします注文

t=# with d(emp_id, date)as (values(1, '31-10-2017'::date),(1, '08-08-2017'),(1, '02-06-2017'),(2,'2016-01-01'),(2,'2016-02-02'),(2,'2016-03-03')) 
select distinct emp_id 
, max(date) over (partition by emp_id) max_date 
, nth_value(date,2) over (partition by emp_id) penultimate_date 
, max(date) over (partition by emp_id) - nth_value(date,2) over (partition by emp_id) diff 
from d 
; 
emp_id | max_date | penultimate_date | diff 
--------+------------+------------------+------ 
     2 | 2016-03-03 | 2016-02-02  | 30 
     1 | 2017-10-31 | 2017-08-08  | 84 
(2 rows) 

Time: 0.756 ms 
+0

このソリューションは複数の従業員にはうまくいかないようです。 –

+0

@HaleemurAliヒントありがとうございます - 確かに、いくつかの行ができない「限界1」:) –

+0

あなたの答えを更新していただきありがとうございます。私はいつも 'nth_value'関数について忘れています。 –

1
WITH emps (emp_id, date) AS (
    VALUES (1, '2017-10-31'::DATE) 
     , (1, '2017-08-08'::DATE) 
     , (1, '2017-08-08'::DATE) 
) 

SELECT DISTINCT ON (emp_id) 
    emp_id 
    , "date" max_date 
    , LEAD("date") OVER w penultimate_date 
    , "date" - LEAD("date") OVER w difference 
FROM emps 
WINDOW w AS (PARTITION BY emp_id) 
ORDER BY emp_id, date DESC 

次の行から日付の値を渡します。

DISTINCT ONは、結果セットをemp_idごとに1行(最初の行が遭遇する)に制限します。

この最初の行には最も大きな日付が含まれている必要があります。したがってLEAD(...) over wは最後から2番目の日付を返します。これにより、次の結果が得られます。

emp_id | max_date | penultimate_date | difference 
--------+------------+------------------+------------ 
     1 | 2017-10-31 | 2017-08-08  |   84 
(1 row) 
関連する問題