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

Hackerrank THE PADS挑战:MySQL通过但Oracle提交报错求助

Oracle代码在THE PADS挑战中排序不符导致Wrong Answer的原因分析

问题背景

在Hackerrank的THE PADS挑战中,MySQL实现代码可通过所有测试用例,但Oracle版本提交后返回Wrong Answer。对比输出发现,仅统计汇总部分的演员(Actor)和歌手(Singer)顺序与预期不一致,其余内容完全匹配。

代码对比

MySQL 工作代码

SELECT CONCAT(Name, '(', LEFT(Occupation,1), ')') FROM OCCUPATIONS 
ORDER BY Name asc;
SELECT CONCAT('There are a total of ', count(name), ' ', LOWER(occupation),'s.' )
FROM OCCUPATIONS
GROUP BY OCCUPATION
ORDER BY count(name);

Oracle 存在问题的代码

SELECT Name || '(' || substr(Occupation,1,1) || ')' FROM OCCUPATIONS 
ORDER BY Name asc;
SELECT 'There are a total of ' || count(name) || ' ' || LOWER(occupation) || 's.'
FROM OCCUPATIONS
GROUP BY OCCUPATION
ORDER BY count(name);

核心原因

当多个职业的count(name)值相同时,MySQL和Oracle的默认排序行为存在差异:

  • MySQL在执行GROUP BY并按count(name)排序时,若计数相同,会自动将分组列(occupation)作为次要排序条件,确保相同计数的职业按字母升序排列。
  • Oracle仅指定ORDER BY count(name)时,对于计数相等的分组,排序顺序是不确定的(取决于数据库内部的存储或处理逻辑),不会自动按职业名称排序。

在该挑战的测试用例中,演员和歌手的计数恰好相等,Oracle的不确定排序导致输出顺序不符合题目隐含的“计数相同时按职业名称升序排列”的要求,进而触发Wrong Answer。

修复方案

修改Oracle的汇总查询,在ORDER BY子句中追加occupation作为次要排序条件,明确指定计数相同时的排序规则:

SELECT 'There are a total of ' || count(name) || ' ' || LOWER(occupation) || 's.'
FROM OCCUPATIONS
GROUP BY OCCUPATION
ORDER BY count(name), occupation;

内容的提问来源于stack exchange,提问作者Rin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 01:31:16