Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 需要找到列的平均值和重复次数_Sql_Counter_Average_Postgresql 9.5 - Fatal编程技术网

Sql 需要找到列的平均值和重复次数

Sql 需要找到列的平均值和重复次数,sql,counter,average,postgresql-9.5,Sql,Counter,Average,Postgresql 9.5,我有一句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 app

我有一句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
但它返回了一个错误:

column "application.id" must appear in the GROUP BY clause or be used in an aggregate function
如果我把它要求我的每一列都加进去,它就不起作用了。 我还尝试通过在选择后添加以下内容来计算程序包名称的数量:

COUNT(package_name) AS count
它会产生类似的错误

我怎样才能得到我想要的结果?我应该进行两次查询,还是可以同时获取所有信息? 我确实看过其他关于S.O.的答案,但没有一个试图在一个“制作”的专栏上进行统计

谢谢你的帮助

编辑:

以下是我最初预期的结果:

尽管戈登的建议没有给我带来正确的结果,但它让我走上了正轨,当我读到这篇文章时: 来自:“与常规聚合函数不同,使用窗口函数不会导致行分组为单个输出行。”

所以我回到了单独使用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
选择application.id、title、url、company.name作为公司名称、package\u名称、platform、country.name作为国家名称、collection.name作为集合名称、category.name作为类别名称,
计数(包名称)为计数,平均值(应用程序历史.排名)为平均值
从应用程序
在application\u history.application\u id=application.id上加入application\u history
申请加入公司。公司\ id=公司id
在应用程序中加入国家/地区\u history.country\u id=country.id
在应用程序上加入集合\u history.collection\u id=collection.id
在应用程序上加入类别\u history.category\u id=category.id
其中application.platform=0
和country.name='CZ'
和集合。name='topfreeapplications'
和类别。name='UTILITIES'

应用程序历史排名我想你需要窗口/分析功能。下面添加了两列,一列用于每个包的行数,另一列用于它们的平均排名:

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 . . .

常规分组提示:“如果指定了GROUP BY子句,则SELECT列表中的每个列引用必须标识分组列或是集合函数的参数。”因此,如果我理解正确,这意味着我必须进行两次查询?@Stanislasdrg:您现在已经显示了结果。现在,请展示您希望它的外观。这将使我们更容易理解你到底想要什么。@ThorstenKettner,好吧,戈登一开始就做对了,所以我想这个问题已经足够明确了。那么为什么要投否决票呢?窗口函数并不完全是pg新手应该知道的。此外,这是文档中pg高级功能的一部分。我没有投反对票。我也注意到你在请求中付出了努力,所以我认为没有理由投反对票。你说得对,戈登说得对。另一方面,我不确定你到底在找什么,所以我帮不了你。例如,短语“我还想按包名称对结果进行分组,这样就不会有冗余。”让我觉得您需要的行数更少。作为一般规则:它确实有助于显示SQL请求的预期结果。这里有很多请求,因此人们不断猜测,猜测被请求的内容;-)谢谢你,戈登。从未听说过窗口/分析功能,我会马上研究:-)@Stanislasdrg:查看Postgres手册中的教程:谢谢你们,它终于成功了!这正是我想要的。
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 . . .