sql与group by选择并加入进行查找

时间:2018-08-23 16:17:43

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

想象一下,我有一个产品表和一个订单表。我想列出每种产品的最新订单

我想像这样的东西

select name, description, price, max(date) 
from product 
  join order on order.item = product.name 
group by order.item

但是我的postgres DB抱怨我无法拥有原始字段(sqlite不会抱怨)我需要具有聚合功能。我可以将min()用于每一列,但考虑到特定产品的所有值始终相同,这似乎是一种浪费。我想知道“与众不同”,但这似乎无济于事

注意-我需要标准的可移植SQL,而不是特定于任何给定的引擎。

4 个答案:

答案 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
               );