You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 16:58:13