Hackerrank奥利凡德的魔杖问题:MySQL窗口函数语法报错求助
问题排查与修复方案
语法错误核心原因
你的代码报错有两个关键问题:
- MySQL版本不兼容:若使用的是MySQL 5.x系列版本,完全不支持
DENSE_RANK()这类窗口函数,这会直接触发语法错误——只有MySQL 8.0及以上版本才支持窗口函数特性。 - 分区逻辑偏离需求:题目要求筛选**相同魔力值(power)和年龄(age)**的魔杖中价格最低的,你当前按
w.code分区的逻辑不符合要求,就算版本兼容也会得到错误结果。
修复后的代码
方案1:MySQL 8.0+ 窗口函数写法(推荐)
SELECT id, age, coins_needed, power FROM (SELECT w.id, wp.age, w.coins_needed, w.power, DENSE_RANK() OVER(PARTITION BY w.power, wp.age ORDER BY w.coins_needed) AS rnk FROM wands w JOIN wands_property wp ON w.code = wp.code WHERE wp.is_evil = 0) t1 WHERE rnk = 1 ORDER BY power DESC, age DESC;
- 修正点:将分区字段改为
w.power, wp.age匹配题目分组要求;明确表别名避免字段歧义。
方案2:兼容MySQL 5.x版本的写法
如果无法升级MySQL版本,用子查询实现相同逻辑:
SELECT w.id, wp.age, w.coins_needed, w.power FROM wands w JOIN wands_property wp ON w.code = wp.code WHERE wp.is_evil = 0 AND w.coins_needed = ( SELECT MIN(coins_needed) FROM wands w2 JOIN wands_property wp2 ON w2.code = wp2.code WHERE wp2.is_evil = 0 AND w2.power = w.power AND wp2.age = wp.age ) ORDER BY w.power DESC, wp.age DESC;
- 逻辑说明:通过关联子查询找出每个(power, age)组的最低价格,再筛选对应记录。
内容的提问来源于stack exchange,提问作者Smriti Agarwal
相关产品推荐
相关产品推荐

