【问题标题】:Selecting Third Highest Value SQLServer [duplicate]选择第三个最高值 SQLServer [重复]
【发布时间】:2018-02-07 19:59:00
【问题描述】:

我正在尝试返回评估成绩第三高的学生的姓名和成绩。我目前得到了正确的答案,但我觉得有更好的方法。

数据集

CREATE TABLE Student( Student_ID INT, Student_Name VARCHAR(10) ) INSERT INTO Student (Student_ID, Student_Name) VALUES (1,'Alex'),(2, 'Brett1'),(3,'Cora'),(4,'David'),(5,'Eleanor'),(6,'Brett2')

CREATE TABLE Grades( Student_ID INT, Assignment_ID INT, Grade INT ) INSERT INTO Grades (Student_ID, Assignment_ID, Grade) VALUES (1,10,90),(2,10,85),(3,10,75),(4,10,74),(1,11,80),(2,11,81),(4,11,88),(6,11,86),(2,12,84)

尝试的解决方案

SELECT top 1 s.Student_Name, g.Grade FROM Student s INNER JOIN Grades g on s.Student_ID=g.Student_ID WHERE g.Grade < 88 ORDER BY Grade DESC

如果没有 (WHERE g.Grade

提前致谢~!

【问题讨论】:

  • Top 1 返回第一个而不是第三个 .. 更好地解释你需要什么

标签: sql sql-server optimization


【解决方案1】:

如果只获得第 3 个,您可以使用前 3 个还原的 TOP 1

  select top 1 Student_name, Grade 
  from ( 
    SELECT top 3 s.Student_Name, g.Grade
      FROM Student s
      INNER JOIN Grades g on s.Student_ID=g.Student_ID
      ORDER BY Grade DESC ) t
      order by Grade asc

【讨论】:

  • 这样做的好处是,如果内部查询中只有两行,它将返回第二行。这可能是您想要的,也可能不是您想要的,但理解起来很微妙。
【解决方案2】:

“较新”的 SQL Server 版本(SQL Server 2012+):

SELECT s.Student_Name, g.Grade
FROM Student s
INNER JOIN Grades g on s.Student_ID=g.Student_ID
ORDER BY Grade DESC
OFFSET 2 FETCH FIRST 1 ROW ONLY 

【讨论】:

    【解决方案3】:

    使用 ROW_NUMBER 窗口函数

    ;with cte
    AS (
    SELECT s.Student_Name, g.Grade ,
    RN = row_number()over(order by Grade desc)
    FROM Student s
     INNER JOIN Grades g on s.Student_ID=g.Student_ID 
    )
    Select *
    From cte
    Where RN = 3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-13
      相关资源
      最近更新 更多