【问题标题】:Getting the ID of the Max record in an aggregate获取聚合中Max记录的ID
【发布时间】: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 值是唯一的。

标签: django django-orm django-aggregation


【解决方案1】:

您使用的是什么数据库后端?如果您的数据库后端支持DISTINCT ON,这很容易通过以下方式完成:

Flight.objects.order_by("rocket", "-start_time").distinct("rocket").values("id", "rocket")

【讨论】:

    猜你喜欢
    • 2015-12-25
    • 1970-01-01
    • 2011-02-24
    • 2013-12-19
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多