MySQL如何不使用GROUP BY返回符合条件的所有行及结果集最大值
解决方案
可以使用窗口函数实现需求,无需GROUP BY,不用重复书写WHERE条件,且性能远优于子查询或UNION方案:
SELECT UserID, UserName, UserScore, MAX(UserScore) OVER() AS ScoreMax FROM Users WHERE UserScore > 30 ORDER BY UserScore;
原理说明
MAX(UserScore) OVER()是窗口函数的用法,当OVER()内不指定分区条件时,会基于当前查询的整个结果集(即WHERE UserScore > 30筛选后的所有行)计算最大值,最终每行都会返回这个全局最大值。- 数据库只需扫描一次符合WHERE条件的数据,避免了子查询/UNION可能带来的多次表扫描或临时表开销,在大数据集下性能更优。
执行上述SQL后,会得到你期望的结果:
| UserID | UserName | UserScore | ScoreMax |
|---|---|---|---|
| 1 | John | 35 | 65 |
| 3 | Chris | 40 | 65 |
| 5 | Frank | 45 | 65 |
| 4 | Paul | 65 | 65 |
内容的提问来源于stack exchange,提问作者user27823396
相关产品推荐
相关产品推荐

