如何在MySQL分组查询MIN(LTP)时获取原表全部字段
解决方法
要获取每个MarketName/SelectionName分组下对应最小LTP的完整记录,你可以用以下两种方案:
方案1:子查询关联(兼容所有MySQL版本)
先筛选出满足条件且分组记录数>900的组,再找出这些组的最小LTP,最后关联原表拿到完整记录:
SELECT ct.* FROM checktable ct INNER JOIN ( -- 先拿到符合条件、记录数>900的分组及其最小LTP SELECT MarketName, SelectionName, MIN(LTP) AS min_ltp FROM checktable WHERE MarketState = "Not In Play" AND SelectionID <> 0 AND CloseTime <> "" AND Result <> "" GROUP BY MarketName, SelectionName HAVING COUNT(*) > 900 ) AS min_data ON ct.MarketName = min_data.MarketName AND ct.SelectionName = min_data.SelectionName AND ct.LTP = min_data.min_ltp WHERE ct.MarketState = "Not In Play" AND ct.SelectionID <> 0 AND ct.CloseTime <> "" AND ct.Result <> "";
方案2:窗口函数(MySQL 8.0及以上版本推荐)
用ROW_NUMBER()窗口函数给每个分组内的记录按LTP升序排序,取排序为1的记录(也就是LTP最小的那条),同时过滤掉记录数不足900的分组:
WITH grouped_data AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY MarketName, SelectionName ORDER BY LTP ASC) AS rn, COUNT(*) OVER (PARTITION BY MarketName, SelectionName) AS group_count FROM checktable WHERE MarketState = "Not In Play" AND SelectionID <> 0 AND CloseTime <> "" AND Result <> "" ) SELECT * FROM grouped_data WHERE rn = 1 AND group_count > 900;
注意点
- 如果同一个分组内有多个记录的LTP都是最小值,方案1会返回所有这些记录,方案2只会返回其中一条(如果要返回所有,把
ROW_NUMBER()换成RANK()即可)。 - 方案2的窗口函数写法更简洁,性能也更优,适合新版本MySQL。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

