【问题标题】:Compare between values from the same table in postgresql在 postgresql 中比较同一表中的值
【发布时间】:2017-03-21 05:46:12
【问题描述】:

我有下表:

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

所以我应该有这样的东西:

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 中找到最新订单。 我试过了:

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

这给出了:

错误:“distinct”处或附近的语法错误。

我有点迷路了。我知道我想做什么,但我不能把它翻译成 SQL。任何人都可以帮忙吗?

【问题讨论】:

    标签: sql postgresql greatest-n-per-group


    【解决方案1】:

    获取每个零件的平均价格和每个价格的最后一个订单并加入这些:

    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;
    

    【讨论】:

      【解决方案2】:

      不用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 
      

      【讨论】:

        猜你喜欢
        • 2014-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多