sqlmax和Double-Join
我有以下三个表格:sqlmax和Double-Join,sql,Sql,我有以下三个表格: student ------- stnumb stname gender grade born subject ------- subjnumb subjname tname results ------- stnumb subjnumb percent 我需要返回每个学生的最高成绩及其科目 示例:鲍勃·史密斯,IPT,92岁 我得到的两个最接近的结果是: SELECT stname , subjname , highestmark FROM
student
-------
stnumb
stname
gender
grade
born
subject
-------
subjnumb
subjname
tname
results
-------
stnumb
subjnumb
percent
我需要返回每个学生的最高成绩及其科目
示例:鲍勃·史密斯,IPT,92岁
我得到的两个最接近的结果是:
SELECT stname
, subjname
, highestmark
FROM (
SELECT MAX(results.percent) as "highestmark"
, student.stname
, subject.subjname
FROM student
, subject
, results
WHERE results.stnumb = student.stnumb
AND results.subjnumb = subject.subjnumb
GROUP BY stname
) maxresult
……还有
SELECT student.stname as Student
, subject.subjname as Subject
, results.percent as Mark
FROM results
JOIN student
ON results.stnumb = student.stnumb
JOIN subject
ON results.subjnumb = subject.subjnumb
ORDER BY stname
有人能给我指一下正确的方向吗?我已经为此工作了好几天,没有任何进展。从GROUP by中缺少SubName判断,这是MySql。MySql没有分析功能,所以您需要调用Top1的旧形式。有一个版本的派生表包含最大值。此表用于筛选原始表:
SELECT pct, subjname, stname
FROM
(SELECT r.pct, sub.subjname, std.stname,
RANK () OVER (PARTITION BY sub.subjname ORDER BY r.pct) as rk
FROM student std
INNER JOIN results r ON r.stnumb = std.stnumb
INNER JOIN subject sub ON sub.subjnumb = r.subjnumb
GROUP BY sub.subjname, std.stname, r.pct ) a
WHERE rk = 1
SELECT student.stname as Student
, subject.subjname as Subject
, results.percent as Mark
FROM results
JOIN student
ON results.stnumb = student.stnumb
JOIN subject
ON results.subjnumb = subject.subjnumb
JOIN
(
SELECT stnumb, MAX(percent) percent
FROM results
GROUP BY stnumb
) top1GradePerStudent
ON results.stnumb = top1GradePerStudent.stnumb
AND results.percent = top1GradePerStudent.percent
ORDER BY stname
也不存在只检索百分比不高的学生记录的方法:
SELECT student.stname as Student
, subject.subjname as Subject
, results.percent as Mark
FROM results
JOIN student
ON results.stnumb = student.stnumb
JOIN subject
ON results.subjnumb = subject.subjnumb
WHERE NOT EXISTS
(
SELECT null
FROM results r2
WHERE r2.stnumb = results.stnumb
AND r2.percent > results.percent
)
ORDER BY stname
这两种方式都会带来回报。如果每个学生都必须有一个记录,请用MAX或MIN括起subjectname,因为行中的所有其他数据都是相同的,所以选择哪个科目并不重要
另外,我没有测试这个问题。可能有输入错误,但基本方法是正确的。它不起作用是非常模糊的,您具体有什么问题?我已经在sqlfiddle中测试了该查询并执行了它。虽然除了您提供的数据结构之外,我对您的数据结构一无所知,但我无法假设什么会“起作用”。我建议的方法是按…顺序排列而不是按…划分。。是解决您概述的问题的正确方法。我知道,这是含糊不清的,但我无法给出任何原因,当您输入错误的查询时,它所做的一切都不会返回任何内容,因此问题可能存在于任何地方。如果我知道更多,我会这么说。伙计,你是传奇人物!非常感谢!!!第一个查询工作得绝对完美。谢谢你的帮助。