Django DenseRank аннотация на основе другой аннотации

Я хочу аннотировать ранжированный набор запросов на основе среднего значения баллов.
annotate(avg=Avg('point'), rank=Window(expression=DenseRank(), order_by=Value("avg").desc())
но ранг равен 1 для всех данных.
Когда я проверяю запрос прямо в базе данных, результат истинный! но в django все ранги равны 1.
. Когда я использую F("avg") вместо Value("avg"), результат верен, но запрос не оптимален. С помощью F() в запросе один раз вычислите среднее значение баллов для avg и вычислите avg снова для рангов avg:
. запрос 1:

SELECT AVG(point) AS avg,
    DENSE_RANK() OVER (
        ORDER BY AVG(point) DESC
    ) rank,

но я хочу получить следующий запрос: запрос 2:

SELECT AVG(point) AS avg,
    DENSE_RANK() OVER (
        ORDER BY avg DESC
    ) rank,

когда я использую Value('avg') генерируется 2 запроса, но все ранги равны 1, а когда я использую F('avg'), результат верен, но генерируется 1 запрос, который не является оптимальным и вычисляет 'avg' дважды (дважды AVG(point) в запросе).

Вернуться на верх