Группировка и агрегация в запросах к SQL в Python

Столкнулся с проблемой, наверное синтаксиса, запроса к SQL в Python. СУБД PostgreSQL

Ошибки с кавычками и пробелами поправил, но все равыно вылезает:

AmbiguousFunction                         Traceback (most recent call last)
<ipython-input-133-ad82da23eca4> in <module>
     29             THEN 'middle'
     30             ELSE 'unknown'
---> 31             END''')
     32 colnames = [desc[0] for desc in cursor.description]
     33 records = cursor.fetchall()

AmbiguousFunction: function avg(unknown) is not unique
LINE 8:         END ages_type, AVG('Pay Rate')
                               ^
HINT:  Could not choose a best candidate function. You might need to add explicit type casts.

Цель: получить средню зарплату по сотрудникам, разбитым на возрастные группы, обращаясь к SQL в Python. Таблица содержит 2 поля:

age: [30,34,31,32,30,30,33,33,31,39,63,38,32,46,31,34,31,29,33,33]

PayRate: [28.5,23.0,29.0,21.5,16.56,20.5,55.0,55.0,34.95,34.95,80.0,65.0,43.0,48.5,40.1,34.0,40.0,35.5,41.0,42.75]

Необходимо сгруппировать age по возрастам:

  • до 33 (junior)
  • от 33 до 99 (midle)

и для каждой группы рассчитать средний показатель PayRate

Делаю через case, но python ругается на синтаксис, подскажите пожалуйста где може быть ошибка. Нашел примеры где этот код работает при обращении к БД в терминале, но в Python не пашет

cursor.execute('''SELECT
       CASE
            WHEN age <= 33
            THEN 'junior'
            WHEN age > 33
            THEN 'middle'
            ELSE 'unknown'
        END ages_type, AVG('Pay Rate')
FROM hr_dataset
GROUP BY
        CASE
            WHEN age <= 33
            THEN 'junior'
            WHEN age > 33
            THEN 'middle'
            ELSE 'unknown'
            END''')

В результате должна получится табличка, с колонками:

  • Type
  • AVG_pay_rate

Где в Type будут указаны группы возрастов, в а AVG_pay_rate средний показатьль из pay_rate


Ответы (1 шт):

Автор решения: Roman Konoval

Ошибка в том, что аргумент в выражении AVG('Pay Rate') неправильный.

Во-первых, кавычки означают, что аргумент - строка. Функция AVG для строки не определена.

Тут конечно имелось ввиду среднее значение поля, а поле называется PayRate соотвественно должно быть без кавычек правильное имя поля, т.е. все вместе AVG(PayRate).

→ Ссылка