比较postgresql中相同表中的值
我有下表:比较postgresql中相同表中的值,sql,postgresql,greatest-n-per-group,Sql,Postgresql,Greatest N Per Group,我有下表: 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
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个月内购买相同零件的其他零件。因此,将id=2与id=1,5进行比较
我想检查每个零件的最新订购日期的价格是否高于过去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最近的购买量是否大于平均值。如果他们是,我需要归还他们的党
所以我应该有这样的东西:
id partid avgprice lastprice
2 10 6.33 9
3 11 0.001 0.001
4 145 18 18
最后我需要返回partid=10,因为9>6.33
现在回答我的问题。。。
我不确定如何在PostgreSQL中找到最新订单。
我试过:
这使得:
错误:位于或接近distinct的语法错误
我在这里有点迷路了。我知道我想做什么,但我不能把它翻译成SQL。有人能帮忙吗 这可以解决,而无需对DB造成严重影响:
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
获取每个零件的平均价格和每个价格的最后一个订单,然后加入这些:
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;
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;