特定员工的最大日期和倒数第二个最大值之间的差异 - postgresql

时间:2017-12-13 16:57:29

标签: postgresql date

有点问题。试图找出postgreSQL中两个日期之间的区别。

我有一张桌子,里面有很多员工:

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 by emp_id,但是如何检索倒数第二个日期。我使用了一些函数,如:

order by date desc limit 1 offset 1

我也尝试将这些放在子查询中,但由于有很多员工编号而且我需要为每位员工安排一行,因此无法运行。

任何人都可以帮忙???

谢谢,

pp84

2 个答案:

答案 0 :(得分:1)

正如@Haleemur Ali所建议的那样,order by date desc limit 1 offset 1不适用于几个emp_id:

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

答案 1 :(得分: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

按降序排序时,LEAD("date") w将给出下一行的日期值。

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)