Django Выбор из подзапроса
Я хочу сделать запрос с помощью оконной функции, а затем сделать некоторую группировку по агрегации на подзапросе. Но я не смог сделать это с помощью метода ORM. Он возвращает aggregate function calls cannot contain window function calls
Есть ли способ сделать запрос, подобный SQL ниже, без использования .raw()
SELECT a.part_id, AVG(a.max_count) FROM (
SELECT part_id,
MAX(count) OVER (PARTITION BY part_id ORDER BY part_id) AS max_count
FROM table_one
) a
GROUP BY a.part_id
В Django вы можете использовать подзапросы, вам не нужно использовать оконные функции. Сначала подзапрос представляет собой Part
queryset, который аннотирован максимальным количеством из TableOne
from django.db.models import Avg, Max, Subquery, OuterRef
parts = Part.objects.filter(
id=OuterRef('part_id')
).annotate(
max=Max('table_one_part__count')
)
Затем аннотируйте набор запросов TableOne
с максимальным подсчетом из подзапроса, выполните values
на столбце, который мы хотим сгруппировать по (col_id
), а затем снова аннотируйте со средним значением, чтобы получить желаемый результат
TableOne.objects.annotate(
max_count=Subquery(p.values('max')[:1])
).values(
'col_id'
).annotate(
Avg('max_count')
)