我有一个 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
它产生这个结果:
我想添加给定包的列平均排名和出现的列数,这将计算包出现在列表中的数量。我还想按 package_name 对结果进行分组,这样我就没有冗余了。
到目前为止,我尝试在 ORDER BY 之前添加一个 GROUP BY 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
它会产生类似的错误。
我怎样才能得到我正在寻找的结果?我应该改为进行两个查询,还是可以一次获取所有内容?我准确地说,我已经查看了关于 SO 的其他答案,但没有一个人试图在“生产”列上进行计数。
感谢您的帮助。
编辑 :
这是我最初期望的结果:
虽然 Gordon 的建议没有给我正确的结果,但它让我走上了正轨,但当我读到这篇文章时:来自文档:“与常规聚合函数不同,使用窗口函数不会导致行分组为单个输出排。”
所以我又开始单独使用 COUNT 和 AVG。我的问题是我想显示排名列和日期以检查事情是否正确。但是,正如 Jarlh 在评论中提到的那样,将这些列放入 Select 会阻止 GROUP BY 按预期工作。
工作查询:
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