Я пытаюсь сформулировать запрос, который выбирает два статистических (avg) столбца. Нет группировки по, я хочу, чтобы агрегаты рассчитывались по всему набору результатов.
Я хочу рассчитать среднее значение пары атрибутов по последнему результату для каждого пользователя, соответствующего определенным критериям.
Отлично работает следующий raw sql:
SELECT AVG(r.points), AVG(r.maxforanswered)
FROM "result" r,
"user" u
WHERE
u.birth_date BETWEEN CURRENT_DATE - ($highage * 365)
AND CURRENT_DATE - ($lowage * 365)
AND u.gender = $gender
AND r.user = u.id
AND r.time_generated = (SELECT MAX(r2.time_generated)
FROM "result" r2
WHERE r2.user = u.id)
Я попробовал несколько формулировок. Когда я читаю документацию, это должно работать:
select((avg(r.points), avg(r.maxforanswered))
for r in Result
for u in User
if r.user == u
and u.gender == gender
and between(u.birth_date, dminus, dplus)
and r.time_generated ==
max(r2.time_generated for r2 in Result if r2.user == u))
В документации сказано, что статистические столбцы не будут включены в GROUP BY. Но я получаю сообщение об ошибке, которое указывает, что это неправильно:
pony.orm.dbapiprovider.ProgrammingError: агрегатные функции не являются
разрешено в GROUP BY LINE 11: GROUP BY AVG ("r". "points"),
Среднее ( "г". "Maxforanswered")
Я хотел бы знать, каким будет синтаксис пони (если он есть) для непосредственной реализации того, что легко сделать в SQL.