2016-04-08 2 views
1

У меня есть 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 

Он производит этот результат:

enter image description here

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

До сих пор я пытался добавить 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:

Вот результат я ожидал первый:

enter image description here

Хотя совет Гордона не дал мне должного результата он положил меня на правильном пути, когда Я читал это: От 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 
+1

General GROUP BY носик: «Если GROUP BY пункта указана, каждую ссылку столбца в SELECT, list должен либо идентифицировать столбец группировки, либо быть аргументом функции set. " – jarlh

+0

Итак, если я правильно понял, это означало бы, что я должен был бы сделать два запроса? – Stanislasdrg

+0

@Stanislasdrg: Вы показали, как выглядит ваш результат сейчас.Теперь, пожалуйста, покажите, как вы хотите, чтобы это выглядело вместо этого. Это значительно облегчит нам понимание того, чего вы хотите. –

ответ

1

Я думаю, что вы хотите окна/аналитические функции. Ниже добавляет два столбца, один для подсчета строк для каждого пакета, а другой среднего рейтинга для них:

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, 
     count(*) over (partition by package_name) as count, 
     avg(ranking) over (partition by package_name) as avg_package_ranking 
FROM application . . . 
+0

Спасибо Гордон. Никогда не слышал о оконных/аналитических функциях, я сразу же изучу его :-) – Stanislasdrg

+0

@Stanislasdrg: ознакомьтесь с учебником в руководстве Postgres: http://www.postgresql.org/docs/current/static/tutorial -window.html –

+0

Спасибо вам обоим, он наконец-то сработал! И именно так я и искал. – Stanislasdrg

Смежные вопросы