You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求编写SQL语句:查询每位学生各科目最新笔记记录

嘿,这需求很常见,我给你两种实用的SQL写法,你可以根据自己的数据库环境来选:

方法1:使用窗口函数(推荐,通用且清晰)

如果你的数据库支持窗口函数(比如PostgreSQL、MySQL 8.0+、SQL Server、Oracle等),这是最直观的写法。我们用ROW_NUMBER()给每个学生的每门科目记录按时间排序,然后取每组里排第一的最新记录:

WITH ranked_notes AS (
    SELECT 
        id_etudiant,
        matiere,
        note, -- 替换成你表中实际的笔记内容字段
        date_note, -- 替换成你表中记录时间的字段
        ROW_NUMBER() OVER (
            PARTITION BY id_etudiant, matiere 
            ORDER BY date_note DESC
        ) AS rn
    FROM notes
)
SELECT id_etudiant, matiere, note, date_note
FROM ranked_notes
WHERE rn = 1;

小提示:

  • 如果同一学生同一科目有多条同一时间的最新记录,ROW_NUMBER()只会返回其中一条。要是想保留所有同时间的最新记录,把ROW_NUMBER()换成RANK()或者DENSE_RANK()就行。
  • 如果你的表有自增主键(比如id_note),且最新记录的主键值最大,也可以把ORDER BY date_note DESC换成ORDER BY id_note DESC,有时候这样查询效率更高。
方法2:使用关联子查询(兼容老版本数据库)

要是你用的是不支持窗口函数的老版本数据库(比如MySQL 5.x),可以用这种方式:先通过子查询找到每个学生每门科目的最新记录时间,再关联回原表获取对应的完整记录:

SELECT n.id_etudiant, n.matiere, n.note, n.date_note
FROM notes n
INNER JOIN (
    SELECT 
        id_etudiant, 
        matiere, 
        MAX(date_note) AS latest_date
    FROM notes
    GROUP BY id_etudiant, matiere
) AS latest 
    ON n.id_etudiant = latest.id_etudiant 
    AND n.matiere = latest.matiere 
    AND n.date_note = latest.latest_date;

注意:

  • 记得把代码里的note和date_note替换成你表中实际的字段名,比如如果笔记内容字段叫contenu,时间字段叫date_enregistrement,直接替换就行。
  • 这种写法会返回同一学生同一科目下所有时间等于最新时间的记录,和用RANK()的效果类似。

内容的提问来源于stack exchange,提问作者Frank Suchaud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:49:26