SQL查询:如何获取每个国家query_score最高的前2条记录
SQL查询错误修正方案
原有代码的错误点
- 表名引用错误:查询的表实际是
maps_query,原有写法误写为maps_search - 排序逻辑错误:要取query_score最高的前2条,窗口函数的排序需要用降序
desc,原有升序会得到得分最低的记录 - 过滤条件逻辑错误:
score_rank = 1 and score_rank=2逻辑不成立,同一行的rank不可能同时为1和2,应该用score_rank <=2 - 语法冗余错误:子查询中
row_number()外层多了多余的括号,外层select末尾多了多余的逗号 - 输出字段不符:需求要输出
query_score,原有写法错误查询了不需要的score_rank - 额外说明:你的需求没有用到
map_time表,本次查询无需关联该表
正确的查询语句
SELECT t1.country, t1.search_query, t1.query_score FROM ( SELECT *, ROW_NUMBER() OVER(PARTITION BY country ORDER BY query_score DESC) AS score_rank FROM maps_query ) t1 WHERE t1.score_rank <= 2
逻辑说明
- 先通过子查询给每个国家的记录按query_score从高到低排序打排名标签
- 外层过滤只保留每个国家排名前2的记录即可
- 如果需要处理同分并列第2的场景,可以把
ROW_NUMBER()换成RANK()或者DENSE_RANK(),根据你的实际业务需求调整即可
内容的提问来源于stack exchange,提问作者LLL
相关产品推荐
相关产品推荐

