比较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;