postgresql - Postgres : averaging a column on distinct of another column in already grouped query

标签 postgresql aggregate

当查询已经为另一个目的分组而不使用子查询时,是否有一种方法可以仅对另一列的不同列进行平均?我知道这可以通过子查询来完成,但除非绝对必要,否则尽量避免重构旧查询。

现有的查询虽然复杂,但与下面的示例具有大致相同的结构。如您所见,图书馆有任意数量的书籍,一本书有任意数量的章节,一章有任意数量的段落,而查询返回每个图书馆的书籍和段落总数。

SELECT libraries.name,
 COUNT(DISTINCT books.id) AS num_books,
 COUNT(paragraphs.id) AS num_paragraphs
FROM libraries
LEFT JOIN books ON books.library_id = libraries.id
LEFT JOIN chapters ON chapters.book_id = books.id
LEFT JOIN paragraphs ON paragraphs.chapter_id = chapters.id
GROUP BY libraries.name

现在假设表 books 有一列 publish_year 并且我想要图书馆中书籍的平均出版年份。显然,我不能简单地添加 AVERAGE(books.publish_year),因为章节和段落较多的书籍会扭曲平均值。

是否有一种好的方法可以再次根据不同的 books.idbooks.publish_year 进行平均,而无需重构查询或者重构查询是否不可避免?

最佳答案

加入前的一个窗口函数

select
    l.name,
    count(distinct b.id) as num_books,
    count(p.id) as num_paragraphs,
    min(year_avg) as year_avg
from
    libraries l
    left join (
        select *, avg(publish_year) over(partition by library_id) as year_avg
        from books
    ) b on b.library_id = l.id
    left join chapters c on c.book_id = b.id
    left join paragraphs p on p.chapter_id = c.id
group by l.name

关于postgresql - Postgres : averaging a column on distinct of another column in already grouped query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43215538/

相关文章:

c# - 如何连接 C# 和 PostgreSQL

ruby-on-rails - 将某些 Rails 对象从暂存转移到 heroku 上的生产数据库

javascript - Mongo $lookup 返回空数组

r - R 中的聚合平均值

mysql - 在大量插入表中处理大型数据集的策略

聚合查询会在 Blazegraph 上导致错误,但在 Sesame 上不会导致错误

sql - postgres 不断给出 "schema does not exist"错误

ruby-on-rails - 更改表时出现死锁

ruby-on-rails - 使用关系数据库

sql - 如何找到列数相等的行?