PostgreSQL如何查询每名学生对应的第一条成绩记录
PostgreSQL按student_id分组取每组第一条记录实现方案
方案1:使用PostgreSQL专属DISTINCT ON语法(性能最优)
这是PostgreSQL独有的优化语法,实现简单且执行效率远高于通用写法:
SELECT DISTINCT ON (student_id) student_id, math, chemistry, science FROM 你的表名 -- ORDER BY必须把student_id放在首位,后续排序规则定义「第一条」的判定逻辑 ORDER BY student_id, ctid;
逻辑说明:DISTINCT ON (student_id) 会保留每个student_id分组下,排序后的第一条记录。示例中使用PG内置的行物理位置标识ctid来匹配你给出的示例排序,如果你表中有自增主键、记录创建时间这类字段,建议替换ctid为对应字段,顺序更稳定。
方案2:使用ROW_NUMBER窗口函数(兼容通用SQL标准)
该写法符合SQL标准,也可以直接在其他支持窗口函数的数据库中使用:
WITH ranked_score AS ( SELECT *, -- 按student_id分组,分组内按规则排序后给行编号 ROW_NUMBER() OVER (PARTITION BY student_id ORDER BY ctid) AS rn FROM 你的表名 ) SELECT student_id, math, chemistry, science FROM ranked_score WHERE rn = 1;
注意:关系型数据库本身没有默认的行顺序,你必须明确「第一条」的判定规则(如插入时间先后、自增ID大小等),避免查询结果不符合预期。
内容的提问来源于stack exchange,提问作者Jake Wagner
相关产品推荐
相关产品推荐

