小编典典

在子查询中选择最大值

sql

我有这两个表:

学生:

|                name |                   email |
|---------------------|-------------------------|
|    Arturo     Vidal |     arturo.vidal@usm.cl |
|   Bastian   Quezada |          bastian@usm.cl |
|    Javier     Jeria |           javier@usm.cl |
| Sebastian    Pi帽era | sebastian@presidente.cl |
| Sebastian  Gallardo |        sebastian@usm.cl |

班级:

| classId |                   email |  signUpDate |
|---------|-------------------------|-------------|
|       1 |        sebastian@usm.cl |  2018-01-01 |
|       1 |           javier@usm.cl |  2019-10-01 |
|       1 |          bastian@usm.cl |  2018-07-01 |
|       2 |        sebastian@usm.cl |  2018-05-04 |
|       2 |          bastian@usm.cl |  2018-01-01 |
|       3 |          bastian@usm.cl |  2018-12-05 |
|       3 |        sebastian@usm.cl |  2018-02-01 |
|       4 |     arturo.vidal@usm.cl |  2018-03-01 |
|       5 | sebastian@presidente.cl |  2018-03-01 |

我想给这个名字显示最后一个注册每个classId的学生的名字。这意味着,我应该为classId 1获得一个名称,为classId
2获得一个名称,以此类推。首先获取邮件(之后才知道学生的名字)的解决方案是:

select classId, email, max(signUpDate)
from Class
group by classId

它会打印最大日期,这是可以的,但同时也会为每个日期打印错误的邮件:

| ClassId |                   email | max(signUpDate) |
|---------|-------------------------|-----------------|
|       1 |        sebastian@usm.cl |      2019-10-01 |
|       2 |        sebastian@usm.cl |      2018-05-04 |
|       3 |          bastian@usm.cl |      2018-12-05 |
|       4 |     arturo.vidal@usm.cl |      2018-03-01 |
|       5 | sebastian@presidente.cl |      2018-03-01 |

这是完全错误的()。因此,当我尝试加入用于获取名称的值时,会得到不正确的值。

换句话说,我不明白为什么行混合在一起。是否有任何解决方案可以为每个ClassId的max(signUpDate)获取正确的电子邮件?

谢谢你的时间


阅读 191

收藏
2021-04-28

共1个答案

小编典典

我创建了测试数据小提琴,并进行了简单易懂的查询以获取所需的数据,即:

SELECT DISTINCT classId,
                std.name,
                Class.email,
                signUpDate
FROM CLASS
INNER JOIN Student std ON std.email = Class.email
WHERE signUpDate IN
    (SELECT max(signUpDate)
     FROM CLASS
     GROUP BY classId)

SQL小提琴在这里

2021-04-28