获取聚合中Max记录的ID
Posted
技术标签:
【中文标题】获取聚合中Max记录的ID【英文标题】:Getting the ID of the Max record in an aggregate 【发布时间】:2020-01-09 12:58:12 【问题描述】:采用这些模型:
class Rocket(Model):
...
class Flight(Model):
rocket = ForeignKey(Rocket)
start_time = DateTimeField(...)
如果我想获得每枚火箭最新飞行的开始时间,这很简单:
>>> Flight.objects.values('rocket').annotate(max_start_time=Max('start_time'))
<QuerySet [
'rocket': 3, 'max_start_time': datetime.datetime(2019, 6, 13, 6, 58, 46, 299013, tzinfo=<UTC>),
'rocket': 4, 'max_start_time': datetime.datetime(2019, 6, 13, 6, 59, 12, 759964, tzinfo=<UTC>),
...]>
但是如果我想选择相同航班的 ID 而不是 max_start_time
怎么办?
换句话说,我想获取每个火箭的最新航班的 ID。
【问题讨论】:
如果我在这里遗漏了一些东西,我很抱歉,但是当你说“那些相同航班的 ID”时,在你给出的例子中你的意思是“3”和“4”对吗? @xplo4d 这些将是火箭队的 ID。我对示例中具有max_start_time
值的航班 ID 感兴趣。
当然,不用做额外的查询。不保证 start_time
值是唯一的。
【参考方案1】:
您使用的是什么数据库后端?如果您的数据库后端支持DISTINCT ON
,这很容易通过以下方式完成:
Flight.objects.order_by("rocket", "-start_time").distinct("rocket").values("id", "rocket")
【讨论】:
以上是关于获取聚合中Max记录的ID的主要内容,如果未能解决你的问题,请参考以下文章
如何使用聚合函数在 MySQL 查询中获取分组记录的第一条和最后一条记录?