无法选择没有重复的最新记录[重复]

Posted

技术标签:

【中文标题】无法选择没有重复的最新记录[重复]【英文标题】:Unable to select the latest record without duplicates [duplicate] 【发布时间】:2020-02-03 11:58:35 【问题描述】:

我正在尝试选择所有学生的最新记录(我不想要学生过去的成绩,只想要他们最近的成绩)。目前,它只返回一个结果。

学生成绩表

╔════╤═══════╤═══════╤═════════════════════╗
║ id │ name  │ grade │ date_added          ║
╠════╪═══════╪═══════╪═════════════════════╣
║ 1  │ bob   │ 23    │ 2019-10-01 14:25:00 ║
╟────┼───────┼───────┼─────────────────────╢
║ 2  │ james │ 45    │ 2019-10-02 17:31:27 ║
╟────┼───────┼───────┼─────────────────────╢
║ 3  │ mike  │ 42    │ 2019-10-03 18:08:13 ║
╟────┼───────┼───────┼─────────────────────╢
║ 4  │ bob   │ 68    │ 2019-10-04 02:00:00 ║
╟────┼───────┼───────┼─────────────────────╢
║ 5  │ mike  │ 83    │ 2019-10-04 09:28:43 ║
╟────┼───────┼───────┼─────────────────────╢
║ 6  │ bob   │ 23    │ 2019-10-04 11:42:00 ║
╟────┼───────┼───────┼─────────────────────╢
║ 7  │ james │ 86    │ 2019-10-05 12:11:20 ║
╚════╧═══════╧═══════╧═════════════════════╝

我希望它返回什么

╔════╤═══════╤═══════╤═════════════════════╗
║ id │ name  │ grade │ date_added          ║
╠════╪═══════╪═══════╪═════════════════════╣
║ 5  │ mike  │ 83    │ 2019-10-04 09:28:43 ║
╟────┼───────┼───────┼─────────────────────╢
║ 6  │ bob   │ 23    │ 2019-10-04 11:42:00 ║
╟────┼───────┼───────┼─────────────────────╢
║ 7  │ james │ 86    │ 2019-10-05 12:11:20 ║
╚════╧═══════╧═══════╧═════════════════════╝

我的sql语句

SELECT id, DISTINCT name, grade, max(date_added)
FROM student_grade
ORDER BY date_added DESC

或者是向我返回此详细信息的有效方式。我对如何获得这个有点困惑。

【问题讨论】:

这是一个很常见的问题。我在问题中添加了greatest-n-per-group 标签。你可以在这里获得大量的技术:***.com/questions/tagged/… 使用这个 SELECT s_g.id,s_g.name,s_g.grade,s_g.date_added FROM student_grade s_g INNER JOIN ( SELECT name, max(grade) as maxgrade FROM student_grade GROUP BY name ) s_g1 ON s_g1 .name = s_g.name 和 s_g1.maxgrade = s_g.grade @nbk 这样您将重新检索与每个学生的最高成绩而不是最新成绩匹配的行。因此,对于bob 记录,您将获得 id 4 而不是 6 我知道但id似乎只是一个自增值没有任何其他目的,所以我认为他不需要最大的id而不是最高的等级,但这应该事先询问跨度> 【参考方案1】:

使用子查询首先选择每个名称的最大 id,然后选择与此 id 相关的记录:

SELECT sg.*
FROM student_grade sg
     INNER JOIN (
          SELECT name, max(id) as id
          FROM student_grade
          GROUP BY name
    ) x ON x.name = sg.name AND x.id = sg.id

我假设id 是查找最后添加记录的正确字段。也许date_added 会更正确,但如果它们具有相同的功能含义,使用id 会更有效

【讨论】:

这行不通。 你是什么意思? “这不起作用”没有帮助

以上是关于无法选择没有重复的最新记录[重复]的主要内容,如果未能解决你的问题,请参考以下文章

根据日期仅选择每条记录的最新版本 | MS Access [重复]

为每个员工选择一天中最早时间戳的完整记录[重复]

SQL查询最新记录[重复]

选择组内的最高记录[重复]

如何选择一列重复的记录? [关闭]

存在重复项时如何选择唯一记录