给出以下数据库结构(它只是一个演示结构):
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子句中。我不知道如何解决这个问题。有人能帮帮我吗?
也许这个问题有另一个解决方案。
提前致谢:)
答案 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来确保首先出现所需的行,否则每个集合都是不可预测的。