MySQL计算中位数报错求助:LIMIT子句使用COUNT函数语法错误
解决计算STATION表LAT_N中位数的SQL语法错误
错误原因
你写的SQL里,LIMIT FLOOR(COUNT(LAT_N)/2),1这行语法不合法——MySQL的LIMIT子句不能直接用聚合函数(比如COUNT)当参数。LIMIT需要的是确定的数值,而COUNT是要先统计全表数据的聚合运算,没法直接嵌套在LIMIT里动态计算。
正确写法
方法一:先算总条数再取偏移量
先把总记录数存到变量里,再用这个变量来计算LIMIT的偏移值:
SET @total = (SELECT COUNT(*) FROM STATION); SELECT LAT_N FROM STATION ORDER BY LAT_N ASC LIMIT FLOOR((@total - 1)/2), 1;
方法二:用窗口函数(适合MySQL 8.0及以上版本)
通过窗口函数给每条数据排号,然后筛选出中间位置的那条:
SELECT LAT_N FROM ( SELECT LAT_N, ROW_NUMBER() OVER (ORDER BY LAT_N) AS rn, COUNT(*) OVER () AS total FROM STATION ) AS temp WHERE rn = FLOOR((total + 1)/2);
额外说明
如果遇到偶数条记录的情况,中位数是中间两个数的平均值,这时候需要调整逻辑取两个数再求平均,但HackerRank这个题的数据集应该是奇数条,上面的写法直接能用。
内容的提问来源于stack exchange,提问作者qwertyui
相关产品推荐
相关产品推荐

