如何使用Sequelize.JS选择具有2个唯一列的所有行



我有一个名为grade的表,它有4列:student_idsubject_idgradedate

日期<2021-12-08>60Jenny数学50Jenny科学9085
student_id subject_id 年级
Jenny 数学 90
Susan 数学2021-12-08
Susan 数学2021-12-07
Susan 科学2021-12-08
Jenny 科学 76 2021-12-06
Susan 科学2021-12-06

你很接近。您正在按student_idsubject_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 ONROW_NUMBER的一些有趣的基准https://stackoverflow.com/a/34715134/2956135

最新更新