mysql - 选择在 MYSQL 中具有最大值的所有行
问题描述
可视化表
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 中选择具有 MAX 值的行/多行中的所有列。所以在这个表中,第 1 项和第 3 项都应该被选中。
我尝试使用 ORDER BY 和 LIMIT 对数据进行排序,但它不适用于具有超过一个最大值的行的数据集,是否有另一种方法来解决这个问题?
解决方案
在 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);
推荐阅读
- c# - 在没有 VPN 的情况下访问专用网络中的数据库
- filepond - React filepond - 一致的 UI/UX 用于删除项目和恢复处理
- javascript - Dart 中 RegExp 的正则表达式
- vba - 如何使用 MS Project 宏将项目信息从 Excel 提取到 MS Project
- macos - Xcode 11 Swift5 Macos 添加故事板 segue 会创建不需要的触发动作
- pandas - 使用 Pandas 根据日期查找最小值和最大值
- python - 在 Pandas 中将每日多索引数据上采样为每小时样本
- react-native - 在地图视图上反应本机滚动视图不滚动
- node.js - 当有长轮询时,反应客户端如何从nodejs回调uri中获取数据
- python - 使用 python 控制 ESP32 的问题