想象一下,我有一个产品表和一个订单表。我想列出每种产品的最新订单
我想像这样的东西
select name, description, price, max(date)
from product
join order on order.item = product.name
group by order.item
但是我的postgres DB抱怨我无法拥有原始字段(sqlite不会抱怨)我需要具有聚合功能。我可以将min()用于每一列,但考虑到特定产品的所有值始终相同,这似乎是一种浪费。我想知道“与众不同”,但这似乎无济于事
注意-我需要标准的可移植SQL,而不是特定于任何给定的引擎。
答案 0 :(得分:1)
在Postgres中,您可以使用distinct on
:
select distinct on (o.item) p.name, description, price, date
from product p join
order o
on o.item = p.name
order by o.item, date desc;
我在查询中添加了别名。我强烈建议您始终限定所有列名称。我会这样做,但在大多数情况下我不知道它们的来源。
答案 1 :(得分:1)
如果需要标准ANSI SQL,则可以使用窗口函数:
std::istringstream test_stream(R"(
put your test data in here
)");
auto structHoldingParsedInput = inputAdapter.adapt(test_stream);
但是在Postgres select *
from (
select p.name, p.description, p.price,
o.date,
max(o.date) over (partition by o.item) as last_date
from product p
join "order" o on o.item = p.name
) t
where date = last_date;
中通常要快很多。
答案 2 :(得分:0)
如果是Oracle或MS,则需要按选择中所有非聚合函数的字段进行分组。 在“ order by”之前加上“ group by p.name,description,price,date”,这将是多余的一行... 关于Postgres,我不太确定,但可能会奏效。
答案 3 :(得分:0)
您可以使用相关子查询:
select p.name, p.description, p.price, o.date
from product p inner join
order o
on o.item = p.name
where o.date = (select max(o1.date)
from order o1
where o1.item = p.name
);