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

Hackerrank奥利凡德的魔杖问题:MySQL窗口函数语法报错求助

问题排查与修复方案

语法错误核心原因

你的代码报错有两个关键问题:

  1. MySQL版本不兼容:若使用的是MySQL 5.x系列版本,完全不支持DENSE_RANK()这类窗口函数,这会直接触发语法错误——只有MySQL 8.0及以上版本才支持窗口函数特性。
  2. 分区逻辑偏离需求:题目要求筛选**相同魔力值(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 14:32:07