【问题标题】:Run WHERE over an Average aggregation result - postgresql在平均聚合结果上运行 WHERE - postgresql
【发布时间】:2015-11-20 22:26:19
【问题描述】:

我有以下查询来获取论文成绩列表。

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;

我想查看平均结果中的 final_grade 变量是否大于 7,但出现错误:

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

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

【问题讨论】:

  • AVG() 在 where 子句中是不允许的。 ): @vkp
  • 您需要将平均条件放在“HAVING”子句中,该子句位于 GROUP BY 之后
  • 我是 SQL 新手。你能用脚本回答这个问题吗,@mlinth?

标签: sql postgresql average aggregation


【解决方案1】:

distinctSELECT 中是不必要的。您还需要将逻辑移至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;

评论:

  • FULL OUTER JOINWHERE 子句转换为LEFT OUTER JOIN。所以,你不妨直言不讳。
  • 与其使用array_agg() 并将结果转换为字符串,不如直接使用string_agg()
  • 表别名使查询更易于编写和阅读。
  • 当然,最终成绩的条件已移至HAVING 子句。该组的条件停留在WHERE

就个人而言,我觉得奇怪的是,您对一个聚合使用相关子查询,而对另一个聚合使用显式聚合。我想这是一个偏好问题。在这种情况下,您可以考虑为两者使用相关子查询。

【讨论】:

  • 我正在使用的系统使用的是旧版本的 postgresql,并且某些函数如 string_agg() 不存在。
  • 我已经结束使用了,它现在正在工作。谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-04-03
  • 1970-01-01
  • 2014-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-03
  • 2018-08-13
相关资源
最近更新 更多