Запрос «наибольший n на группу» в Django 2.0? - PullRequest
0 голосов
/ 02 июля 2018

В принципе, я хочу сделать это , но с django 2.0.

Если я попытаюсь:

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

Я получаю обратно все строки, но к каждой записи добавлено свойство my_max.

1 Ответ

0 голосов
/ 02 июля 2018

Если вы используете PostgreSQL:

Purchases.objects.filter(.....).order_by(
    'customer', '-field_of_interest'
).distinct('customer')

или с Window выражением

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

, но последний может выдать несколько строк на клиента, если они имеют одинаковые 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)
...