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

特定员工的最大日期和倒数第二个最大日期之间的差异-postgresql,postgresql,date,Postgresql,Date,在一个问题上被卡住了。试图在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\u id

在一个问题上被卡住了。试图在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 by
emp\u id,但是如何检索倒数第二个日期。我使用了一些功能,如:

order by date desc limit 1 offset 1
我也试着把这些放在子查询中,但没有成功,因为有很多员工号码,我需要每个员工一行

有人能帮忙吗

谢谢


pp84

正如@Haleemur Ali善意建议的那样,
按日期说明订单限额1偏移量1
不适用于多个emp\u 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

正如@Haleemur Ali善意建议的那样,
按日期说明订单限额1偏移量1
不适用于多个emp\u 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
按降序排序时,
LEAD(“date”)w
将给出下一行的日期值

每个
emp\u id
上的
DISTINCT将结果集限制为1行(遇到的第一行)

在我们订购时,第一行必须包含最长日期,因此w上的
前导(…)将返回倒数第二个日期。这给了我们以下结果:

 emp_id |  max_date  | penultimate_date | difference
--------+------------+------------------+------------
      1 | 2017-10-31 | 2017-08-08       |         84
(1 row)
按降序排序时,
LEAD(“date”)w
将给出下一行的日期值

每个
emp\u id
上的
DISTINCT将结果集限制为1行(遇到的第一行)

在我们订购时,第一行必须包含最长日期,因此w上的
前导(…)将返回倒数第二个日期。这给了我们以下结果:

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

我觉得这个解决方案不适用于多个员工。@Haleemulali感谢您的提示-当然
限制1
不能有几行:)谢谢您更新您的答案。我总是忘记第n个值的功能。我觉得这个解决方案不适合多个员工。@Haleemulli谢谢你的提示-当然
限制1
不能有几行:)谢谢你更新你的答案。我总是忘记
n\u值
函数。