Расчет среднего по группам в Джанго - PullRequest
2 голосов
/ 04 мая 2011

Я хотел бы знать в Django, как получить среднее количество сгруппированных элементов в моей таблице на элемент (без использования .extra (...), если это возможно).

Конкретно у меня есть таблица (DwarvesEatingCakes), состоящий из гномов и тортов.Каждая пара (карлик, торт) уникальна.Я хочу получить среднее количество тортов, съеденных каждым гномом.

Следующий код не работает:

avg_cakeeaten_dict = DwarvesEatingCakes.values('dwarf').annotate(num_cake=Count('cake')).aggregate(avg_cake_eaten=Avg('num_cake'))

Спасибо за помощь!

Ответы [ 2 ]

2 голосов
/ 04 мая 2011

Ответ, который я в итоге использовал, следующий (на основе ответа Роба):

num_entries = DwarvesEatingCakes.objects.count() # get the number of entries
num_dwarves = DwarvesEatingCakes.objects.aggregate(num_dwarf=Count('dwarf', distinct=True))
return num_entries / float(num_dwarves['num_dwarf'])

Конечно, вы также проверяете деление на 0. Хотя это может быть стандартный способ сделать этопоскольку это довольно распространенный запрос.

0 голосов
/ 04 мая 2011

Я не уверен, что правильно вас понимаю, но я думаю, что вы хотите вычислить это единственное число (используя синтаксис PostgreSQL):

SELECT CAST(COUNT(DISTINCT cake_id) AS REAL) / COUNT(DISTINCT dwarf_id) FROM dwarves_eating_cakes

Возможно, есть какой-то способ сделать это водин QuerySet, если вы присоединяетесь к столу с самим собой (начинаете махать рукой), но это кажется мне неэффективным и неловким.Лично я склонен выполнять запрос напрямую:

def cake_average() :
  from django.db import connection
  c = connection.cursor()
  c.execute("SELECT CAST(COUNT(DISTINCT cake_id) AS REAL) / COUNT(DISTINCT dwarf_id) FROM dwarves_eating_cakes")
  return c.fetchall()[0][0]

Одним из преимуществ этого подхода является то, что вы можете расширить эту функцию для вычисления дополнительной статистики в том же запросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...