在 group by 中获取具有正确报价 ID 的最高报价并加入查询

Posted

技术标签:

【中文标题】在 group by 中获取具有正确报价 ID 的最高报价并加入查询【英文标题】:Get highest offer price with correct offer id in group by and join query 【发布时间】:2021-03-22 23:15:27 【问题描述】:

我正在使用产品 ID 将产品表与报价表连接起来,我的要求是获得该产品的最高报价(%),同时我想为产品 ID 进行分组,因为我不想重复产品,但它显示了错误的报价 ID,因为加入查询首先基于产品 ID 执行:

产品表:

id   name
1     abc
2     xyz

报价表

id   to_date        product_id   offer
1   2020-12-18       1            30%
2   2020-12-18       1            40%
3   2020-12-18       2            30%
4   2020-12-18       2            40%

查询:

SELECT product_id,product.name,o.id as offer_id,o.to_date, max(o.offer)offer_price
FROM products 
  LEFT JOIN offers o ON o.product_id=product.id
GROUP BY product.id

有问题的输出(错误的报价 ID):

offer_id product_id  to_date       offer_price 
 1           1        2020-12-18      40%
 3           2        2020-12-18      40%

预期输出(正确的报价 ID)

offer_id product_id  to_date       offer_price 
 2           1        2020-12-18      40%
 4           2        2020-12-18      40%

【问题讨论】:

您的 GROUP BY 无效,并且会在较新的 mysql 版本中引发错误(除非在兼容模式下。) 您使用的是哪个 MySQL 版本? mysql 版本 5.6.49 @jarlh 你能告诉我查询,它不会在未来版本中使用 group by 并实现完美的报价 id 在子查询中进行 GROUP BY 以获取每个产品的最高报价。加入。 【参考方案1】:

你可以使用窗口函数:

select o.*, p.name as product_name
from product p
left join (
    select o.*,
        row_number() over(partition by product_id order by offer desc) rn
    from offer o
) o on o.product_id = p.id and o.rn = 1

row_number() 对具有相同 product_id 的记录按降序排列 offer - 因此每种产品的报价最高的行将获得排名 1。然后,您可以使用该信息进行过滤。

这需要 MySQL 8.0。在早期版本中,一种替代方法使用相关子查询来过滤每个产品的最高报价:

select o.*, p.name as product_name
from product p
left join offer o 
    on  o.product_id = p.id
    and o.offer = (select max(o1.offer) from offer o1 where o1.product_id = p.id)

【讨论】:

我不明白你的查询,row_number 是什么 @user_1234:我用更多信息编辑了我的答案。我还为您正在运行的 MySQL 版本添加了解决方案。 我可以用left join代替inner join吗,因为很少有产品没有offer @user_1234:我为此更新了答案。 确定,我正在检查

以上是关于在 group by 中获取具有正确报价 ID 的最高报价并加入查询的主要内容,如果未能解决你的问题,请参考以下文章

从 GROUP BY 中获取具有 NULL 列的行

sum()在具有多个联接的MySQL查询中不能正常工作(group by不能按预期工作)

如何使用 group by(基于一列)从表中选择多列,在 hive 查询中具有和计数

Doctrine 2 - GROUP BY 两列,得到不正确的值

我们如何在具有GROUP BY子句的查询中选择非聚合列,而GROUP BY子句在功能上不依赖于GROUP BY子句中的列?

在 GROUP BY 中选择具有最大日期的整行