可视化表格
item title numTimesPurchased
1 Beer 30
2 Chips 13
3 Smokes 30
4 Gum 3到目前为止我写的代码
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对数据进行排序,但它不适用于有超过一行的最大值的数据集,有没有其他方法来解决这个问题?
发布于 2021-04-30 14:41:18
在MySQL 8+上处理此问题的一种很好的方法是使用RANK分析函数:
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子句中使用一个不相关的子查询来检查购买的次数:
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);发布于 2021-04-30 14:40:32
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 = maxsumCTE中的MAX(SUM(quantity)) OVER ()计算所有行中(SUM(quantity) = numTimesPurchased的)最大值。因此,外部查询会过滤numTimesPurchased不等于这个最大值的行(形式上并不是需要更少的值,但不能存在大于最大值的值)。
PS。我希望quantity是,而不是 of float或double数据类型。但是如果是,那么SUM(quantity) (两个表达式都在CTE中)必须四舍五入到合理的精度。
https://stackoverflow.com/questions/67329266
复制相似问题