在平均聚合结果上的何处运行-postgresql

在平均聚合结果上的何处运行-postgresql,sql,postgresql,average,aggregation,Sql,Postgresql,Average,Aggregation,我有下面的查询,可以得到论文等级列表 SELECT DISTINCT papers.paper_id, papers.paper_title, AVG(paper_judge_participations.paper_judge_participation_score) AS final_grade, (SELECT array_agg(paper_author_name) FROM paper_authors as authors WHERE authors.paper_id=papers.p

我有下面的查询,可以得到论文等级列表

SELECT DISTINCT papers.paper_id, papers.paper_title, AVG(paper_judge_participations.paper_judge_participation_score) AS final_grade,
(SELECT array_agg(paper_author_name) FROM paper_authors as authors WHERE authors.paper_id=papers.paper_id )::varchar as paper_author_name
FROM papers 
FULL JOIN paper_categories ON paper_categories.paper_category_id=papers.paper_category_id
LEFT JOIN paper_judge_participations ON papers.paper_id = paper_judge_participations.paper_id 
WHERE ((papers.paper_note IS NULL AND final_grade >= 7) OR (papers.paper_note IS NOT NULL AND papers.paper_note >= 7)) AND papers.paper_category_id = 1
GROUP BY papers.paper_id ORDER BY final_grade, papers.paper_note;
我想看看averae结果中的最终_等级变量是否大于7,但我得到了错误:

ERROR:  column "final_grade" does not exist
LINE 6: WHERE ((papers.paper_note IS NULL AND final_grade >= 7) OR (...

如何在我的
WHERE
条件下使用平均结果?

选择中不需要
distinct
。您还需要将逻辑移到
HAVING
子句:

SELECT p.paper_id, p.paper_title,
       AVG(pjp.paper_judge_participation_score) AS final_grade,
       (SELECT string_agg(paper_author_name)
        FROM paper_authors pa
        WHERE pa.paper_id = p.paper_id
       ) as paper_author_name
FROM papers p LEFT JOIN
     paper_categories pc
     ON pc.paper_category_id = p.paper_category_id LEFT JOIN 
     paper_judge_participations pjp
     ON p.paper_id = pjp.paper_id 
HAVING p.paper_category_id = 1
GROUP BY p.paper_id
HAVING (p.paper_note IS NULL AND final_grade >= 7) OR
       (p.paper_note IS NOT NULL AND p.paper_note >= 7) AND 
ORDER BY final_grade, p.paper_note;
评论:

  • WHERE
    子句将
    完全外部联接
    转换为
    左外部联接
    。所以,你最好是直截了当的
  • 与其执行
    array\u agg()
    并将结果转换为字符串,不如直接使用
    string\u agg()
  • 表别名使查询更易于编写和读取
  • 当然,最终成绩的条件已经转移到了HAVING
子句中。组上的条件保留在
中,其中

就我个人而言,我觉得很奇怪,一个聚合使用相关子查询,另一个聚合使用显式聚合。我想这是一个偏好的问题。在这种情况下,您可以考虑使用一个相关的子查询,在.WHERE子句中不允许使用./p>avg()。VKP您需要将avg条件放在“HAVING”子句中,该子句位于组BYI之后,因为我是SQL新手。你能用脚本@mlinth来回答这个问题吗?我正在使用的系统使用的是一个旧版本的postgresql,一些函数如string_agg()不存在。我结束了使用have,现在它可以工作了。谢谢