在sql server中找到特定数据的最大值

时间:2014-12-27 13:24:13

标签: sql sql-server database select sql-order-by

我仍然对sql server感到困惑,例如我有学生表,我试图找到java学生的最大分数

STUDENT
| id | name  | mark | subject |
|  1 | jenny |  67  |  db    | 
|  2 | mark  |  74  |  java  |
|  3 | nala  |  90  |  java  |

我试着像这样输出

|  3 | nala  |  90  | 

我在sql中写这个,但输出是空的。

SELECT id,name,mark
FROM student
WHERE subject='Java'
 AND mark=
(SELECT max(mark) FROM student);

我该如何纠正它?

5 个答案:

答案 0 :(得分:2)

有很多方法可以在SQL中获得所需内容。但是,您应该了解您的方法存在的问题:

SELECT id, name, mark
FROM student
WHERE subject = 'Java' AND
      mark = (SELECT max(mark) FROM student);

问题是mark的最大值可能不适用于'Java'。因此,没有行可以通过where条件。

您需要在子查询中重复显示过滤器:

SELECT id, name, mark
FROM student
WHERE subject = 'Java' AND
      mark = (SELECT max(mark) FROM student WHERE subject = 'Java');

或使用相关子查询:

SELECT s.id, s.name, s.mark
FROM student s
WHERE s.subject = 'Java' AND
      s.mark = (SELECT max(mark) FROM student s2 WHERE s2.subject = s.subject);

请注意,最后一个查询使用表别名。您应该学会在查询中使用这些内容;有时它们是必要的,它们通常使查询更容易编写,阅读和理解。

答案 1 :(得分:1)

TOP 1 ORDER BY 子句一起使用以获取最高数据

试试这个:

SELECT TOP 1 id, name, mark
FROM student
WHERE subject = 'Java'
ORDER BY mark DESC;

SELECT id, name, mark
FROM (SELECT id, name, mark, ROW_NUMBER() OVER (ORDER BY mark DESC) AS RowNum
      FROM student
      WHERE subject = 'Java'
     ) AS A 
WHERE RowNum = 1;

答案 2 :(得分:1)

您不需要使用子查询。使用Top 1 with ties为学生提供最高分,如果最多分数由多名学生分享

Where condition会将结果过滤为只有subject = 'Java'之后,排名靠前的1将获取java

中的最大标记
SELECT TOP 1 with ties id, name, mark
FROM student
WHERE subject = 'Java'
ORDER BY mark DESC

答案 3 :(得分:0)

使用您正在尝试的内容(使用子查询),您可以执行以下操作:

SELECT id,name,mark
FROM student
WHERE subject='Java' 
AND   mark = (SELECT MAX(mark) 
              FROM student 
              WHERE subject='Java');

您正在尝试获取所有记录的最大值,而不考虑主题名称。

答案 4 :(得分:0)

尝试简单的查询以获得结果

SELECT TOP 1 ID,NAME,mark FROM STUDENT
  WHERE SUBJECT ='JAVA'
  ORDER BY MARK DESC