有点问题。试图找出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
答案 0 :(得分:1)
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)