У меня есть SQL-предложение:Нужно найти среднее и число повторений столбца
SELECT application.id,title,url,company.name AS company_name,package_name,ranking,date,platform,country.name AS country_name,collection.name AS collection_name,category.name AS category_name FROM application
JOIN application_history ON application_history.application_id = application.id
JOIN company ON application.company_id = company.id
JOIN country ON application_history.country_id = country.id
JOIN collection ON application_history.collection_id = collection.id
JOIN category ON application_history.category_id = category.id
WHERE application.platform=0
AND country.name ='CZ'
AND collection.name='topfreeapplications'
AND category.name='UTILITIES'
AND application_history.ranking <= 10
AND date::date BETWEEN date (CURRENT_DATE - INTERVAL '1 month') AND CURRENT_DATE
ORDER BY application_history.ranking ASC
Он производит этот результат:
Я хотел бы добавить как в среднем столбец ранжирование для данного пакета, а также количество столбцов, которое будет подсчитывать число, которое пакет отображает в списке. Я также хотел бы Группировать результаты по имени_пакета, так что у меня нет увольнений.
До сих пор я пытался добавить GROUP BY пунктом перед ORDER BY:
GROUP BY package_name
Но он возвращает мне ошибку:
column "application.id" must appear in the GROUP BY clause or be used in an aggregate function
Если добавить каждый который он запрашивает, он не работает. Я также попытался подсчитать количество имен пакетов, добавляя после SELECT:
COUNT(package_name) AS count
Он производит подобную ошибку.
Как я могу получить результат, который я ищу? Должен ли я сделать два запроса вместо этого, или можно получить все сразу? Я точно посмотрел на другие ответы на S.O, но никто из них не пытается сделать COUNT на «произведенной» колонке.
Благодарим за помощь.
Edit:
Вот результат я ожидал первый:
Хотя совет Гордона не дал мне должного результата он положил меня на правильном пути, когда Я читал это: От docs: «В отличие от обычных агрегатных функций использование оконной функции не приводит к группировке строк в одну выходную строку».
Поэтому я вернулся к использованию только COUNT и AVG. Моя проблема состояла в том, что я хотел показать столбец ранжирования и дату, чтобы проверить, все ли правильно. Но помещая эти столбцы в Select, чтобы GROUP BY работала должным образом, как упоминал Jarlh в комментариях.
Рабочий запрос:
SELECT application.id,title,url,company.name AS company_name,package_name,platform,country.name AS country_name,collection.name AS collection_name,category.name AS category_name,
COUNT(package_name) AS count, AVG(application_history.ranking) AS avg
FROM application
JOIN application_history ON application_history.application_id = application.id
JOIN company ON application.company_id = company.id
JOIN country ON application_history.country_id = country.id
JOIN collection ON application_history.collection_id = collection.id
JOIN category ON application_history.category_id = category.id
WHERE application.platform=0
AND country.name ='CZ'
AND collection.name='topfreeapplications'
AND category.name='UTILITIES'
AND application_history.ranking <= 10
AND date::date BETWEEN date (CURRENT_DATE - INTERVAL '1 month') AND CURRENT_DATE
GROUP BY package_name,application.id,company.name,country.name,collection.name,category.name
ORDER BY count DESC
General GROUP BY носик: «Если GROUP BY пункта указана, каждую ссылку столбца в SELECT, list должен либо идентифицировать столбец группировки, либо быть аргументом функции set. " – jarlh
Итак, если я правильно понял, это означало бы, что я должен был бы сделать два запроса? – Stanislasdrg
@Stanislasdrg: Вы показали, как выглядит ваш результат сейчас.Теперь, пожалуйста, покажите, как вы хотите, чтобы это выглядело вместо этого. Это значительно облегчит нам понимание того, чего вы хотите. –