如何在postgres sql中获取第二个最大日期

如何在postgres sql中获取第二个最大日期,sql,postgresql,datetime,Sql,Postgresql,Datetime,我有以下情况,我需要得到两个发票日期之间的几个值 所以查询是基于发票提供数据,现在我需要做的是为一些值获取这个发票日期和最后一个发票日期之间的数据 已经尝试过的方法 1) 子查询将很容易解决这个问题,但我必须对4-5列和15GB数据库执行此操作,所以这是不可能的。 2) 如果我像这样走 left join (select inv.date ,inv,actno from invoice inv) as invo on invo.actno=act.id and invo.date < in

我有以下情况,我需要得到两个发票日期之间的几个值

所以查询是基于发票提供数据,现在我需要做的是为一些值获取这个发票日期和最后一个发票日期之间的数据

已经尝试过的方法 1) 子查询将很容易解决这个问题,但我必须对4-5列和15GB数据库执行此操作,所以这是不可能的。 2) 如果我像这样走

left join (select inv.date ,inv,actno from invoice inv) as invo on invo.actno=act.id and invo.date < inv.date
我需要这个

 id |date                 |date                 | id 
  1 | 2017-01-31 00:00:00 | 2017-01-30 00:00:00 |  2
  2 | 2017-01-30 00:00:00 | 2017-01-29 00:00:00 |  3
  3 | 2017-01-29 00:00:00 | 2017-01-28 00:00:00 |  4
  4 | 2017-01-28 00:00:00 | 2017-01-27 00:00:00 |  5
  5 | 2017-01-27 00:00:00 |  
我无法在select中执行子查询,因为数据库很大,需要对4-5列执行此操作

更新1

我需要来自同一个表的数据,但在from子句中使用了两次,因为我的要求是我需要从发票表中连接几个数据,然后有4-5列,其中我需要上一个和这个发票之间支付的金额的总和

因此,我可以在子查询中获取两个发票日期,并获取它们之间的数据

更新2

滞后并不能解决这个问题

select i.id,i.date, lag(date) over (order by date) from inv i order by id ;
id |        date         |         lag        
----+---------------------+---------------------
1 | 2017-01-31 00:00:00 | 2017-01-30 00:00:00
2 | 2017-01-30 00:00:00 | 2017-01-29 00:00:00
3 | 2017-01-29 00:00:00 | 2017-01-28 00:00:00
4 | 2017-01-28 00:00:00 | 2017-01-27 00:00:00
5 | 2017-01-27 00:00:00 | 
(5 rows)
Time: 0.480 ms
test=# select i.id,i.date, lag(date) over (order by date) from inv i where id=2 order by id ;
 id |        date         | lag 
----+---------------------+-----
  2 | 2017-01-30 00:00:00 | 
(1 row)
Time: 0.525 ms
test=# select i.id,i.date, lag(date) over (order by date) from inv i where id in (2,3) order by id ;
 id |        date         |         lag       
----+---------------------+---------------------
2 | 2017-01-30 00:00:00 | 2017-01-29 00:00:00
3 | 2017-01-29 00:00:00 | 
它将根据从该查询中的表中获得的数据进行计算,在该查询中它是有界的,请参见此处3有一个延迟,但无法获得,因为查询不允许它有延迟…需要在左连接中执行某些操作,以便可以从同一个表中获取延迟日期,但再次调用from子句,再次感谢buddy

类似这里

t=# select date as d1,
           lag(date) over (order by date) 
    from inv 
    order by 1 desc;


         d1          |         lag
---------------------+---------------------
 2017-01-31 00:00:00 | 2017-01-30 00:00:00
 2017-01-30 00:00:00 | 2017-01-29 00:00:00
 2017-01-29 00:00:00 | 2017-01-28 00:00:00
 2017-01-28 00:00:00 | 2017-01-27 00:00:00
 2017-01-27 00:00:00 |
(5 rows)

Time: 1.416 ms

选择日期为d1,从inv中滞后(日期)超过()d2
@VaoTsun我想你需要一个
结束(按日期排序)
你的问题的标题与你的预期输出不一致。@Gurv可能不一致,但这是我第一次发帖,我认为他在解释问题时做得很好。@JuanCarlosOropeza考虑到他只有一列,应该在不指定顺序的情况下工作吗?不确定Though谢谢Juan但这不会解决我的问题它肯定会像我的示例中那样获得数据,但不会给我所需的id。我已经更新了我的问题,我确实遗漏了其中的一些要点。@VijayVerma:只需添加
lag(id)over(order by date)
来获得id lag也不会解决此测试=#选择i.id,i.date,lag(date)从inv i开始(订单日期),其中(2,3)订单id中的id为id;id | date | lag---+-------------------2 | 2017-01-30 00:00:00 | 2017-01-29 00:00:00 3 | 2017-01-29 00:00:00 |它将根据从该查询中的表中获取的数据计算它在该查询中是有界的参见此处3有一个滞后,但无法获取,因为查询不允许它拥有它
t=# select date as d1,
           lag(date) over (order by date) 
    from inv 
    order by 1 desc;


         d1          |         lag
---------------------+---------------------
 2017-01-31 00:00:00 | 2017-01-30 00:00:00
 2017-01-30 00:00:00 | 2017-01-29 00:00:00
 2017-01-29 00:00:00 | 2017-01-28 00:00:00
 2017-01-28 00:00:00 | 2017-01-27 00:00:00
 2017-01-27 00:00:00 |
(5 rows)

Time: 1.416 ms