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) в запросе).