描述
牛客每次考试完,都会有一个成绩表(grade),如下:
第1行表示用户id为1的用户选择了C++岗位并且考了11001分
。。。
第8行表示用户id为8的用户选择了前端岗位并且考了9999分
请你写一个sql语句查询用户分数大于其所在工作(job)分数的平均分的所有grade的属性,并且以id的升序排序,如下:
(注意: sqlite 1/2得到的不是0.5,得到的是0,只有1*1.0/2才会得到0.5,sqlite四舍五入的函数为round)
drop table if exists grade; CREATE TABLE grade( `id` int(4) NOT NULL, `job` varchar(32) NOT NULL, `score` int(10) NOT NULL, PRIMARY KEY (`id`)); INSERT INTO grade VALUES (1,'C++',11001), (2,'C++',10000), (3,'C++',9000), (4,'Java',12000), (5,'Java',13000), (6,'JS',12000), (7,'JS',11000), (8,'JS',9999), (9,'Java',12500);
建立一个含有平均分的子表(注意用窗口函数,而不是GROUP BY)
主表左联结子表,用WHERE 过滤条件。
WITH avg_score AS ( SELECT id, AVG(score) OVER ( PARTITION BY job ORDER BY job) AS avg_score_job FROM grade) SELECT grade.id, grade.job, grade.score FROM grade LEFT JOIN avg_score ON grade.id = avg_score.id WHERE grade.score > avg_score.avg_score_job ORDER BY grade.id;