Django 2.0 中的“greatest-n-per-group”查询?

r_z*_*zny 5 django greatest-n-per-group

基本上,我想做这个,但在Django 2.0。

如果我尝试:

Purchases.objects.filter(.....).annotate(my_max=Window( expression=Max('field_of_interest'), partition_by=F('customer') ) )

我取回所有行,但将my_max属性添加到每条记录。

Ale*_*nov 5

如果您使用的是 PostgreSQL:

Purchases.objects.filter(.....).order_by(
    'customer', '-field_of_interest'
).distinct('customer')
Run Code Online (Sandbox Code Playgroud)

更新:过滤器中不允许使用窗口表达式,因此以下方法不起作用。请参阅此答案以获取最新解决方案

或用Window表情

Purchases.objects.filter(.....).annotate(my_max=Window(
    expression=Max('field_of_interest'),
    partition_by=F('customer')
    )
).filter(my_max=F('field_of_interest'))
Run Code Online (Sandbox Code Playgroud)

但后者可以为每个客户产生多行,如果他们有相同的 field_of_interest

另一个Window,每个客户单排

Purchases.objects.filter(.....).annotate(row_number=Window(
        expression=RowNumber(),
        partition_by=F('customer'),
        order_by=F('field_of_interest').desc()
        )
    ).filter(row_number=1)
Run Code Online (Sandbox Code Playgroud)

  • 一个后续:当我尝试最后一个查询时,我得到一个错误:`django.db.utils.NotSupportedError: Window is disallowed in the filter clause.` 每行都有正确的 `row_number` 属性,但现在我使用的是 python 而不是db 删除 row_number > 1 的所有记录。有什么办法可以解决这个问题? (2认同)