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

时间:2017-01-30 14:43:54

标签: sql postgresql datetime

我有以下情况,我需要在两张发票日期之间获得多个值。

因此查询现在根据发票提供数据我需要做的是在发票日期和最后发票日期之间获取数据的某些值

已经尝试过了 1)子查询将很容易解决这个问题,但因为我必须为4-5列和它的15 gb数据库执行此操作,因此这是不可能的。 2)如果我这样做

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

那么它将提供的所有数据少于该日期,但我只需要一个小于主发票日期的数据。

3)我们无法在from子句的子查询中获得第二个最大值,因为外部发票没有分组,所以它可能是max或midlle或者最少。

4)我们不能在连接表的子查询中发送其他表的值。

create table inv (id serial ,date timestamp without time zone);

insert into inv (date) values('2017-01-31 00:00:00'),('2017-01-30 00:00:00'),('2017-01-29 00:00:00'),('2017-01-28 00:00:00'),('2017-01-27 00:00:00');

select date as d1 from inv;
 id |        date         
----+---------------------
  1 | 2017-01-31 00:00:00
  2 | 2017-01-30 00:00:00
  3 | 2017-01-29 00:00:00
  4 | 2017-01-28 00:00:00
  5 | 2017-01-27 00:00:00

(5 rows)

我需要这个

 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有滞后但无法得到它导致查询不允许它拥有它....需要完成左连接,因此延迟日期可以从同一个表中获取但是再次从子句中再次调用它再次感谢好友

1 个答案:

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