2017-03-21 14 views
1

で同じテーブルからの値の間の比較:は、私は次の表を持っているPostgreSQLの

id partid orderdate  qty price 
1 10  01/01/2017 10 3 
2 10  02/01/2017 5  9 
3 11  01/01/2017 0.5 0.001 
4 145 02/01/2017 5  18 
5 10  12/12/2016 8  7 
6 10  05/07/2010 81 7.5 

基本的に私は24 monthsの期間で同じ部分の他の購買への部品の最も最近の購入を比較したいです。その点については、id=2id = 1,5を比較してください。

最新のorderdateの価格が過去24ヶ月以内のその部分の平均価格より大きいかどうかを確認したいと思います。私はまた、各パーツの最新の受注日を知る必要があり

partid avgprice 
10  (3+9+7)/3=6.33 (7.5 is out of range) 
11  0.001 
145  18 

id partid 
2 10 
3 11 
4 145 

をしてから、私は、ID = 2かどうかを確認する必要があり

だから最初に私は、平均価格を計算する必要があります、id = 3、id = 6(最新の購入)は平均よりも大きい。彼らは私が彼らのpartidを返す必要がある場合。

は、だから私はこのようなものが必要です:私は、最新のを見つけることができるかどうかはわかりません ...

9>6.33ので、今私の質問に

id partid avgprice lastprice 
2 10  6.33   9 
3 11  0.001  0.001 
4 145  18   18 

を最後に、私はpartid=10を返却する必要がありますPostgreSQLでご注文ください。 私が試した:

select id, distinct partid,orderdate 
from table 
where orderdate> current_date - interval '24 months' 
order by orderdate desc 

これが与える:

ERROR: syntax error at or near "distinct".

私はここで失われたのビット。私は何をしたいのか分かっていますが、それをSQLに変換することはできません。誰でも助けることができますか?

答えて

2

は一部あたりavarageと価格につきラストオーダーを取得し、これらに参加:

select 
    lastorder.id, 
    lastorder.partid, 
    lastorder.orderdate, 
    lastorder.price as lastprice, 
    avgorder.price as avgprice 
from 
(
    select 
    partid, 
    avg(price) as price 
    from mytable 
    where orderdate >= current_date - interval '24 months' 
    group by partid 
) avgorder 
join 
(
    select distinct on (partid) 
    id, 
    partid, 
    orderdate, 
    price 
    from mytable 
    order by partid, orderdate desc 
) lastorder on lastorder.partid = avgorder.partid 
      and lastorder.price > avgorder.price; 
1

これは(とにかくDB上に重いです)distinctずに解決することができます:

with avg_price as (
select partid, avg(price) as price 
from table 
where orderdate> current_date - interval '24 months' 
group by partid 
) 
select f.id, f.partid, av.price, f.price 
from (
     select id, partid, orderdate, price, rank() over (partition by partid order by orderdate desc) 
     from table 
    ) as f 
join avg_price av on f.partid = av.partid 
where f.rank = 1 
and av.price < f.price 
関連する問題