2017-12-13 6 views
0

비트가 문제에 봉착했습니다. postgreSQL에서 두 날짜의 차이점을 찾으려고합니다. 수행하는 방법 그러나,특정 날짜의 최대 날짜와 두 번째 최대 값의 차이점 - postgresql

당신이 max(date)을 사용할 수 있습니다 분명히
emp_id, max_date, penultimate_date, difference 

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

group byemp_id을 :

emp_id, date 

1, 31-10-2017 

1, 08-08-2017 

1, 02-06-2017 

나는 그것을 같이 할 :

나는 거기에 많은 직원 테이블 EMP를 끝에서 두 번째 날짜를 검색합니다. 나는 또한 하위 쿼리에서 다음을 넣어 시도

order by date desc limit 1 offset 1 

하지만이 많은 직원의 숫자와 나는 각 직원에 대해 하나 개의 행을 필요로하는 그 hasn, t는 일 : 내가 좋아하는 몇 가지 기능을 사용하고 있습니다.

아무도 도와 줄 수 있습니까 ???

감사합니다,

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은 끝에서 두 번째 날짜를 반환합니다. 이렇게하면 다음과 같은 결과를 얻을 수 있습니다.

emp_id | max_date | penultimate_date | difference 
--------+------------+------------------+------------ 
     1 | 2017-10-31 | 2017-08-08  |   84 
(1 row)