当查询已经为另一个目的分组而不使用子查询时,是否有一种方法可以仅对另一列的不同列进行平均?我知道这可以通过子查询来完成,但除非绝对必要,否则尽量避免重构旧查询。
现有的查询虽然复杂,但与下面的示例具有大致相同的结构。如您所见,图书馆有任意数量的书籍,一本书有任意数量的章节,一章有任意数量的段落,而查询返回每个图书馆的书籍和段落总数。
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.id 对 books.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/