如何使用其他列选择最大日期

时间:2014-05-08 07:47:53

标签: sql postgresql

给出以下数据库结构(它只是一个演示结构):

order:
| id | orderedat |

order_item:
| id | id_order | id_article | price | currency |

我想得到的是每篇文章的最新订单价格:

| id_article | orderedat | price | currency |

我写这篇陈述是为了实现这个目标:

WITH "last_ordered" AS (   
  SELECT "oi"."id_article", "oi"."id" as "id_oi", MAX("o"."orderedat")   
  FROM "order" "o", "order_item" "oi"   
  WHERE ("oi"."id_order" = "o"."id")            
  GROUP BY "oi"."id", "oi"."id_id_article"    
)   
SELECT "oi"."id_article", "o"."orderedat", "oi"."price", "oi"."currency"   
FROM "order_item" "oi"   
INNER JOIN "last_ordered" ON ("oi"."id" = "last_ordered"."id_oi")   
INNER JOIN "order" "o" ON ("oi"."id_order" = "o"."id") 

但是,group by是错误的,因为它为文章链接的每个order_item返回一行。另一方面,专栏" oi.id"必须出现在GROUP BY子句中。我不知道如何解决这个问题。有人能帮帮我吗?

也许这个问题有另一个解决方案。

提前致谢:)

2 个答案:

答案 0 :(得分:0)

WITH "last_ordered" AS (   
  SELECT "o".*,"oi".*,
         ROW_NUMBER() OVER (PARTITION BY "oi"."id_id_article" ORDER BY "o"."orderedat" DESC) as Rnum 
  FROM "order" "o"
  INNER JOIN "order_item" "oi"   
  ON "oi"."id_order" = "o"."id"            

) 

SELECT * FROM  last_ordered
WHERE Rnum =1

答案 1 :(得分:0)

select distinct on (id_article)
    id_article, orderedat, price, currency
from
    order o
    inner join
    order_item oi on o.id = oi.id_order
order by id_article, orderedat desc

检查distinct on

  

SELECT DISTINCT ON(expression [,...])仅保留给定表达式求值的每组行的第一行。使用与ORDER BY相同的规则解释DISTINCT ON表达式(参见上文)。注意"第一行"除非使用ORDER BY来确保首先出现所需的行,否则每个集合都是不可预测的。