首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >选择MYSQL中具有最大值的所有行

选择MYSQL中具有最大值的所有行
EN

Stack Overflow用户
提问于 2021-04-30 14:37:51
回答 2查看 23关注 0票数 0

可视化表格

代码语言:javascript
运行
复制
item     title    numTimesPurchased
1        Beer     30
2        Chips    13
3        Smokes   30
4        Gum      3

到目前为止我写的代码

代码语言:javascript
运行
复制
SELECT Purchase.item, Item.title, SUM(quantity) AS numTimesPurchased 
FROM Item 
INNER JOIN Purchase ON Item.id = Purchase.item 
GROUP BY item, title;

我需要选择行/多行中的所有列,其中具有numTimePurchased中的最大值。因此,在此表中,应同时选择项目1和项目3。

我已经尝试过使用ORDER BY和LIMIT对数据进行排序,但它不适用于有超过一行的最大值的数据集,有没有其他方法来解决这个问题?

EN

回答 2

Stack Overflow用户

发布于 2021-04-30 14:41:18

在MySQL 8+上处理此问题的一种很好的方法是使用RANK分析函数:

代码语言:javascript
运行
复制
WITH cte AS (
    SELECT p.item, i.title, SUM(quantity) AS numTimesPurchased,
           RANK() OVER (ORDER BY SUM(quantity) DESC) rnk
    FROM Item i
    INNER JOIN Purchase p ON i.id = p.item
    GROUP BY p.item, i.title
)

SELECT item, title, numTimesPurchased
FROM cte
WHERE rnk = 1;

在MySQL的早期版本中,有一种处理方法是在HAVING子句中使用一个不相关的子查询来检查购买的次数:

代码语言:javascript
运行
复制
SELECT p.item, i.title, SUM(quantity) AS numTimesPurchased
FROM Item i
INNER JOIN Purchase p ON i.id = p.item
GROUP BY p.item, i.title
HAVING SUM(quantity) = (SELECT SUM(quantity)
                        FROM Item i
                        INNER JOIN Purchase p ON i.id = p.item
                        GROUP BY p.item, i.title
                        ORDER BY SUM(quantity) DESC
                        LIMIT 1);
票数 2
EN

Stack Overflow用户

发布于 2021-04-30 14:40:32

代码语言:javascript
运行
复制
WITH cte AS ( SELECT Purchase.item, Item.title, SUM(quantity) AS numTimesPurchased 
                   , MAX(SUM(quantity)) OVER () maxsum
              FROM Item 
              INNER JOIN Purchase ON Item.id = Purchase.item 
              GROUP BY item, title )
SELECT * FROM cte WHERE numTimesPurchased = maxsum

CTE中的MAX(SUM(quantity)) OVER ()计算所有行中(SUM(quantity) = numTimesPurchased的)最大值。因此,外部查询会过滤numTimesPurchased不等于这个最大值的行(形式上并不是需要更少的值,但不能存在大于最大值的值)。

PS。我希望quantity,而不是 of float或double数据类型。但是如果是,那么SUM(quantity) (两个表达式都在CTE中)必须四舍五入到合理的精度。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67329266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档