2017-01-30 38 views
1

私は2つの請求書の日付の間にいくつかの値を取得する必要がある次のような状況があります。postgresのSQLで2番目の最大日付を取得する方法

だから、クエリで、一部の値が 1)サブクエリは簡単にこの問題を解決します。この請求書の日付と最後の請求日

すでに試した方法との間でデータをフェッチするために私は何をする必要がある今の請求書に基づいてデータを与えるが、など私は4-5の列とその15ギガバイトのデータベースのためにこれを行う必要がありますので、不可能です。私はこの

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

ように行けば 2)それは、その日、すべてのデータが少なくなりますが、私はメインの請求書の日付よりも少なくなります一つだけのデータを必要としています。

3)外側の請求書はグループ化されていないので、max句またはmidlleまたはそれ以上でないため、from句のサブクエリで2番目の最大値を取得できません。

4)他のテーブルの値をジョインテーブルのサブクエリに送信できません。私はデータベースが大きいと選択でサブクエリを行い、4-5列

UPDATE 1のためにこれを行うために必要なことはできません。この

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 | 

が必要

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) 

私は同じテーブルからこれを必要としますが、FROM句で2回使用します。私の要件はいくつか必要ですデータは請求書テーブルから結合され、最後にこの請求書の間に支払われた金額の合計などが必要な4-5列があります。

だから私は、サブクエリで、両方の請求書の日付を取得し、UPDATE 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節Thで再び呼び出すanksは再びここに同様

+3

'選択日付D1として、ラグ(日)オーバー()D2;' –

+1

私はあなたが 'オーバー(日付順)が必要だと思う@VaoTsun ' –

+0

あなたの質問のタイトルはあなたの予想される出力と一致しません。 – GurV

答えて

3

をバディ?:

INVから
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 
+0

ありがとうJuanしかし、これは私の例では確かにデータを取得しますが、私に必要なIDを与えることはありません私の問題を解決しません。私はそれのいくつかの点を逃した私の質問を更新しました。 –

+0

@VijayVerma:IDを取得するために 'lag(id)を(日付順)'を追加するだけです –

+0

ラグはこれを解決しません test =#select i.id、i.date、lag(date)over id)(id)(2,3)順のidからのid id: 日付|ラグ ---- + --------------------- + --------------------- 2 | 2017-01-30 00:00:00 | 2017-01-29 00:00:00 3 | 2017-01-29 00:00:00 | クエリでテーブルから取得するデータは、そのクエリでバインドされているデータが計算されます。ここで参照してください3は遅延がありますが、取得できませんでしたクエリがそれを持つことを許可していません –

関連する問題