MariaDB如何按market、coin、period三列分组查询每组最大openTime
Candlestick表分组取最大值查询解决方案
你编写的SQL存在两个核心问题:
- 子查询中计算
MAX(openTime)时是对全表按period分组,返回的是所有币种对应周期的最大时间,不是筛选条件market = 'USDT' AND coin = 'ETH'下的最大值,匹配逻辑自然不符合预期 - 外层无意义的
GROUP BY在MariaDB非严格模式下返回的非聚合字段值不确定,结果不可靠
推荐方案(适配你使用的MariaDB 10.3版本)
优先用窗口函数实现,逻辑更清晰不易出错:
SELECT openTime, market, coin, period FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY period ORDER BY openTime DESC) AS rn FROM Candlestick WHERE market = 'USDT' AND coin = 'ETH' ) AS temp WHERE rn = 1;
逻辑说明:内层查询先筛选出符合USDT和ETH条件的记录,按period分组后每组内按openTime倒序排序,用ROW_NUMBER标记排序序号,外层只取每组序号为1的记录,就是每个周期最大openTime对应的完整行。
兼容旧版本方案(无窗口函数场景)
可以用关联子查询实现:
SELECT c.* FROM Candlestick c INNER JOIN ( SELECT period, MAX(openTime) AS max_openTime FROM Candlestick WHERE market = 'USDT' AND coin = 'ETH' GROUP BY period ) AS max_time ON c.period = max_time.period AND c.openTime = max_time.max_openTime WHERE c.market = 'USDT' AND c.coin = 'ETH';
逻辑说明:先通过子查询拿到USDT-ETH下每个周期对应的最大openTime,再和原表关联匹配,就能拿到每个周期最大时间对应的完整记录。
内容的提问来源于stack exchange,提问作者A. Vreeswijk
相关产品推荐
相关产品推荐

