синтаксис запроса для агрегатов, не работающих как рекламируется - PullRequest
1 голос
/ 15 июня 2019

Я пытаюсь сформулировать запрос, который выбирает два статистических (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.

...