2017-03-26 13 views
0

私は順番にアイテムのこのテーブルを持っている:これは与えpostgreSQLの最新の値を2行取得するには?

select distinct on (itemid) * 
from orderitems 
order by itemid,createdate 

orderitemid orderid itemid quantity price  createdate 
3    2  12  2  12.5   2016-12-05 11:35:02.06629 
4    2  17  1  12.6   2016-12-05 11:35:02.06629 
5    1  18  15 14.5   2016-12-04 11:35:02.06629 

orderitemid orderid itemid quantity price  createdate 
1    1  12  5  15.5   2016-12-04 11:35:02.06629 
2    1  17  5  13.2   2016-12-04 11:32:02.06629 
3    2  12  2  12.5   2016-12-05 11:35:02.06629 
4    2  17  1  12.6   2016-12-05 11:35:02.06629 
5    2  18  15 14.5   2016-12-04 11:35:02.06629 
6    3  12  45  3   2015-12-04 11:35:02.06629 

私は、各項目の最新の順序を与えるクエリを持っています今私がしたいのは、アイテムの前の注文に関するアイテム情報ごとに同じ行に入ることです。基本的項目

の第二の最新の順序で項目の最新の順序を比較するために、これは私が欲しいものです:

orderitemid itemid quantity price 2ndquantity 2ndprice 2ndorderitemid 
3    12  2  12.5   5   15.5   1 
4    17  1  12.6   1   13.2   2 
5    18  15 14.5   

は、どのように私はそれを行うには、私のクエリを変更することができますか?

+0

あなたの例ではどこに 'partid'列がありますか? @OtoShavadze itemid。 –

+0

項目と部分は同じです。混乱させて申し訳ありません。 – avi

+0

itemid 12の最新の注文は2ではなく、orderid 3です –

答えて

5
with ranked as (
    select orderitemid, orderid, itemid, quantity, price, createdate, 
     row_number() over (partition by itemid order by createdate desc) as rn 
    from orderitems 
) 
select r1.*, r2.quantity as "2ndquantity", r2.price as "2ndprice", 
     r2.orderitemid as "2ndorderitemid" 
from ranked r1 
    left join ranked r2 on r1.itemid = r2.itemid and r2.rn = 2 
where r1.rn = 1; 

CTEは1番目と2番目のアイテムを計算し、最終的なセレクトはジョインでそれらを一緒にします。 2番目の行がない可能性があるため、左の結合が必要であり、その場合はその項目がまったく表示されないことに注意してください。

オンライン例:http://rextester.com/SDBZ21144

+0

createdate DESCによってitemid順にパーティション化してはいけませんか? – avi

+0

@aviおそらくはい、私はちょうどあなたの質問で使用した 'order by'定義を使っていました(あなたが望むものが得られますが、1行だけです) –

2

ええええええええええええええええええええええええとの行を次に直近の価格と比較したいですか?

WITH comparison_rank AS (
    SELECT orderitemid, itemid, price, quantity 
      rank() over (partition by itemid order by createddate) 
     FROM orderitems 
) 
SELECT o.orderitemid, o.itemid, o.price, o.quantity, o.price, o.createddate, 
     p.price as prevprice, p.quantity as prevqty 
    FROM orderitems o JOIN comparison_rank c ON o.orderitemid = c.orderitemid 
    LEFT JOIN comparison_rank p ON c.rank = p.rank + 1 AND c.itemid = p.itemid; 

しかし、これは大きなデータセットではあまり効果がありません。パフォーマンスを向上させるために、パフォーマンスを向上させるためにデータモデルを改善する必要があると思います。