感谢 老虎刘 刘老师 对 5月20日 SQL 问题纠正贴 ---PostgreSQL 同一种SQL为什么这样写会提升45%性能...

在 5月20日发帖,PostgreSQL 同一种SQL为什么这样写会提升45%性能 --程序员和DBA思维方式不同决定,中的第二部分,中关于SQL的撰写与题目不符的问题进行纠正,感谢老虎刘, 刘老师的及时指正。

9f9f37c6fd80221c3b35ac219196a7a4.png

错误的位置在以下部分,语句撰写与描述部分无关的问题。

练习2 展示考分中,英语成绩最低,但通过数学成绩进行排名从高的人的学号,姓名和数学分数

这个语句的主要撰写的方案是,先对要进行查询的数据范围进行缩小,lowestEnglistscorestudents 就是在对最低的英语成绩进行筛选,这里的distinct on 主要是对student_id 进行去重,防止一个学生在不同的学期的英语成绩都是最低的,然后最后展示的不是两个人而是一个人两次占用的最低英语成绩的名额,基于POSTGRESQL中在order by 语句中的去重不能直接写distinct 只能使用distinct on 的表达方式。

在获得最低英语成绩的两个学生的ID后,在通过mathscoresforlowestenglish 来对要展示的数据进行组合,这里只获取英语最低成绩的两个人的ID 与整体数据进行LEFT JOIN 后只展示数学成绩,最后在获得数据后,对数据成绩进行倒序排序完成整个语句的撰写

sql_test=# WITH LowestEnglishScoreStudents AS (
    SELECT DISTINCT ON (student_id)
        student_id
    FROM
        scores
    WHERE
        subject_id = 2
    ORDER BY
        student_id, score ASC
    LIMIT 2
),
MathScoresForLowestEnglish AS (
    SELECT
        s.student_id,
        st.name,
        s.score AS math_score
    FROM
        scores s
    JOIN
        LowestEnglishScoreStudents les ON s.student_id = les.student_id
    JOIN
        students st ON s.student_id = st.student_id
    WHERE
        s.subject_id = 1
)
SELECT
    student_id,
    name,
    math_score
FROM
    MathScoresForLowestEnglish
ORDER BY
    math_score DESC;
 student_id | name  | math_score 
------------+-------+------------
          1 | John  |         95
          2 | Alice |         92
          1 | John  |         90
          2 | Alice |         80
(4 rows)

经过刘老师的指点,语句应为下图,再次感谢刘老师指正!!

14f31ac296acb5bcfed0a855d077ea08.png

aba04b4ea65f6a13b4029d188d15a013.png

请各位读者注意相关问题和刘老师给出的改正SQL。

原贴为:

https://mp.weixin.qq.com/s?__biz=Mzg4NDA0NTEwNA==&mid=2247501929&idx=1&sn=05afa9d867b5deeb36bcd05d6bee73e0&chksm=cfbcac36f8cb25208d010fdffa83631169e91434e43d6dd975b51830b053f9187864b3fb9c7d&token=2096854191&lang=zh_CN#rd

今天同时注意本公众号送书活动,请关注送书活动页面,并在下方留言,幸运也许就是你的。

9941737f174aa04fc31dfc0520e7c9b0.png

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值