暂时未有相关云产品技术能力~
暂无个人介绍
2024年05月
写题时遇见的一道SQL
有一个数据表?student,包含以下列:id、name和score。每个学生都有一个唯一的ID,name?是学生的姓名,score?是该学生的分数。编写一个?SQL?查询,使用以下条件筛选前三个最高分数的学生:
CREATE?TABLE?student( ??id?INT, ??name?VARCHAR(100), ??score?INT );
INSERT?INTO?student?VALUES?(1,?'AAA',?80); INSERT?INTO?student?VALUES?(2,?'BBB',?67); INSERT?INTO?student?VALUES?(3,?'CCC',?92); INSERT?INTO?student?VALUES?(4,?'DDD',?91); INSERT?INTO?student?VALUES?(5,?'EEE',?88); INSERT?INTO?student?VALUES?(6,?'FFF',?95); INSERT?INTO?student?VALUES?(7,?'GGG',?87); INSERT?INTO?student?VALUES?(8,?'HHH',?90); INSERT?INTO?student?VALUES?(9,?'III',?79);
想了好久,发现这个问题可以使用?RANK()?函数和子查询来解决。以下是解决方案: SELECT?*?FROM?( ??SELECT?*,?RANK()?OVER?(ORDER?BY?score?DESC)?AS?rank ??FROM?student )?as?s WHERE?s.rank?<=?3;
这个方案首先对学生表进行了一个子查询,并且使用?RANK()?函数来为每个学生成绩进行排名。然后,它在查询结果中找到排名前三的学生。 如果有多个学生分数一样,排名可能会出现重复。如果不希望重复排名,可以使用?DENSE_RANK()?函数来代替?RANK()。