我有一个名为grade
的表,它有4列:student_id
、subject_id
、grade
和date
。
student_id | subject_id | 年级 | 日期|
---|---|---|---|
Jenny | 数学 | 90 | <2021-12-08>|
Susan | 数学 | 602021-12-08 | Jenny数学|
Susan | 数学 | 502021-12-07 | Jenny科学|
Susan | 科学 | 902021-12-08 | |
Jenny | 科学 | 76 | 2021-12-06 |
Susan | 科学 | 852021-12-06 |
你很接近。您正在按student_id
和subject_id
进行分组,您只需要MAX('date')
。
await Grade.findAll({
attributes: ['student_id', 'subject_id', 'grade', [Sequelize.fn('max', Sequelize.col('date')), 'date']],
raw: true,
group: ['student_id', 'subject_id']
})
属性中的数组可以执行给定名称[function, alias]
的函数和别名。
例如:
[Sequelize.fn('max', Sequelize.col('date')), 'new_name']]
属性中的此语法将SQL创建为
MAX(`date`) as `new_name`
=============================================
更新:
上述查询在Postgres中不起作用。
参考:https://dba.stackexchange.com/a/194352
为了在Postgres中实现相同的查询,一种替代解决方案是使用DISTINCT ON
。
await Grade.findAll({
attributes: [Sequelize.literal('DISTINCT ON ("student_id", "subject_id") *'),
'id', 'student_id', 'subject_id', 'date', 'grade'],
order: ['student_id', 'subject_id', ['date', 'DESC']]
})
有关DISTINCT ON
查询的更多信息,请查看https://zaiste.net/posts/postgresql-distinct-on/
这篇文章还涉及到@sia提到的窗口函数的使用。
DISTINCT ON
和ROW_NUMBER
的一些有趣的基准https://stackoverflow.com/a/34715134/2956135