在 5月20日发帖,PostgreSQL 同一种SQL为什么这样写会提升45%性能 --程序员和DBA思维方式不同决定,中的第二部分,中关于SQL的撰写与题目不符的问题进行纠正,感谢老虎刘, 刘老师的及时指正。
错误的位置在以下部分,语句撰写与描述部分无关的问题。
练习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)
经过刘老师的指点,语句应为下图,再次感谢刘老师指正!!
请各位读者注意相关问题和刘老师给出的改正SQL。