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属性添加到每条记录。
如果您使用的是 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)