题解 | #考试分数(三)#

考试分数(三)

https://www.nowcoder.com/practice/b83f8b0e7e934d95a56c24f047260d91

v1 想直接group by + order by + limit,结果做不出来

v2 用窗口函数

主要逻辑:

  • 用窗口函数 给每个language_id 组内 按score倒序后,标记序号rank_number
  • 筛选每个组里 rank_number =1和2,即第1名和第2名 (因为用的是dense_rank,因此如果有同值的情况也能查出来)
select 
    a.id,
    a.name,
    a.score
from (
    select 
        g.id,
        l.name,
        g.score,
        dense_rank()over(partition by g.language_id order by g.score desc) as rank_number
    from grade g
        left join language l on g.language_id=l.id
)a
where a.rank_number in (1,2)
order by 
    a.name asc,
    a.score desc, 
    a.id asc

v3 参考评论答案,尝试不用窗口函数,直接用select join解决

主要逻辑:先找出「分数比当前分数高」的记录个数,当记录个数少于2个的时候,说明这条记录是最高值或第二高的值

select 
    a.id,
    l.name,
    a.score
from 
(
    select 
        g1.language_id,
        g1.id,
        g1.score
    from grade g1, grade g2 
    # 这里不能用join,会导致多一行c++ 11000的数据。至于为啥,目前没头绪
    where g2.score >= g1.score and 
        g1.language_id = g2.language_id
    group by g1.language_id,g1.id
    having count(distinct g2.score)<=2
)a
left join language l on a.language_id=l.id
order by 
    l.name asc,
    a.score desc, 
    a.id asc

在子查询中,from 一行,我刚开始用了join:from grade g1 join grade g2 on g1.id=g2.id

结果一直多一行c++ 11000的数据。

最后改为 from grade g1, grade g2才行。至于为啥,目前没头绪,希望有知道的大佬能帮忙看看

全部评论

相关推荐

2025年10月3日中午,在写完定时一年后发给自己的信之后,敲下键盘,写下这篇文字。我把标题的“所有人”加了引号,因为如我们所见,确实有的人顺风顺水,每天过的很开心,或是早早进入大厂,或是年纪轻轻就拿到了高薪offer,或是过着可能我努力十年也不一定实现的生活。但也许,不是每个人的痛苦都能被别人看到的,这个月我经常会哭,被骗6000块钱、手上钱不够导致拖欠房租、生活还要借朋友钱、国庆长假也没有钱去旅游,互联网公司不稳定担心试用期不过(毕竟上段实习就是被裁了,一有点风吹草动就害怕),但这样的我,不是所有人都知道的,居然是有些朋友的羡慕对象。回忆我的七年“长跑”别人都是多年幸福的恋爱长跑,我没有恋...
故事和酒66:让每一颗种子找到合适自己的生长方式,最终绽放出独一无二的花朵,这远比所有人都被迫长成同一棵“参天大树”的世界,更加美好和富有生机。这是社会和环境的问题,而不是我们的问题。然而就是在这样的环境中,楼主依然能突破自我,逆势成长,其中的艰辛可想而知。这一路的苦难终究会化作你成长的养料
你小时候最想从事什么职业
点赞 评论 收藏
分享
ResourceUt...:楼主有自己的垃圾箱,公司也有自己的人才库
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务