PostgreSQL中的嵌套聚合函数
我正试图为每个PostgreSQL中的嵌套聚合函数,sql,node.js,postgresql,average,array-agg,Sql,Node.js,Postgresql,Average,Array Agg,我正试图为每个文章组返回每个作者id,作者姓名,以及平均值(总计)每个作者。我试图将作者id、作者姓名和平均值(总计)组合到数组中。我知道这个查询将为每个数组返回一个article\u组,但这很好 我最初尝试将AVG(total)(而不是AVG\u total)放入我的array\u agg()中。这导致出现一条错误消息,指出我不能使用嵌套聚合函数 我一直在想办法解决这个问题,但似乎没办法解决。我试着在WHERE子句中添加一个子查询作为avg_total,但没有成功 因此,现在我尝试将作为avg
文章组
返回每个作者id
,作者姓名
,以及平均值(总计)
每个作者
。我试图将作者id
、作者姓名
和平均值(总计)
组合到数组中。我知道这个查询将为每个数组返回一个article\u组
,但这很好
我最初尝试将AVG(total)
(而不是AVG\u total
)放入我的array\u agg()中。这导致出现一条错误消息,指出我不能使用嵌套聚合函数
我一直在想办法解决这个问题,但似乎没办法解决。我试着在WHERE
子句中添加一个子查询作为avg_total
,但没有成功
因此,现在我尝试将作为avg_total
别名放在FROM
子句之前的独立子查询中,但它仍然不起作用
以下是查询:
SELECT b.article_group_id, b.article_group,
array_agg('[' || c.author_id || ',' || c.author_name || ',' || avg_total || ']'),
AVG((SELECT total
FROM article f
LEFT JOIN article_to_author w ON f.article_id = w.article_id
LEFT JOIN author v ON w.author_id = c.author_id
LEFT JOIN grade z ON f.article_id = z.article_id
) AS avg_total)
FROM article f
LEFT JOIN article_group b ON b.article_group_id = f.article_group_id
LEFT JOIN article_to_author w ON f.article_id = w.article_id
LEFT JOIN author c ON w.author_id = c.author_id
GROUP BY b.article_group_id, b. article_group
这是当前的错误消息:
{ error: syntax error at or near "AS"
at Connection.parseE (Z:\GitFolder\roqq\server\node_modules\pg\lib\connection.js:614:13)
at Connection.parseMessage (Z:\GitFolder\roqq\server\node_modules\pg\lib\connection.js:413:19)
at Socket.<anonymous> (Z:\GitFolder\roqq\server\node_modules\pg\lib\connection.js:129:22)
at Socket.emit (events.js:198:13)
at Socket.EventEmitter.emit (domain.js:448:20)
at addChunk (_stream_readable.js:288:12)
at readableAddChunk (_stream_readable.js:269:11)
at Socket.Readable.push (_stream_readable.js:224:10)
at TCP.onStreamRead [as onread] (internal/stream_base_commons.js:94:17)
name: 'error',
length: 92,
severity: 'ERROR',
code: '42601',
detail: undefined,
hint: undefined,
position: '430',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'scan.l',
line: '1149',
routine: 'scanner_yyerror' }
在你的问题中,很多事情都不清楚。根据我对您当前查询的理解,请尝试以下操作:
with cte as (
SELECT ag.article_group_id,
ag.article_group,
au.author_id,
au.author_name,
avg(gr.total) as avg_total
FROM article_group ag
LEFT JOIN article ar on ar.article_group_id=ag.article_group_id
LEFT JOIN article_to_author ata ON ar.article_id = ata.article_id
LEFT JOIN author au ON ata.author_id = au.author_id
LEFT JOIN grade gr ON ar.article_id = gr.article_id
GROUP BY ag.article_group_id, ag.article_group, au.author_id, au.author_name
)
SELECT article_group_id,
article_group,
array_agg('[' || author_id || ',' || author_name || ',' || avg_total || ']')
FROM cte
GROUP BY article_group_id, article_group
您可以在array\u agg
我认为这是两个层次的聚合。这允许您准确计算总体平均值:
SELECT article_group_id, array_agg( (author_id, author_name, avg_grade)) as authors,
SUM(total_grade) / SUM(num_grade) as group_avg
FROM (SELECT ag.article_group_id, au.author_id, au.author_name,
AVG(gr.total) as avg_grade,
SUM(gr.total) as total_grade,
COUNT(gr.total) as num_grade
FROM article_group ag LEFT JOIN
article ar
ON ar.article_group_id=ag.article_group_id LEFT JOIN
article_to_author ata
ON ar.article_id = ata.article_id LEFT JOIN
author au
ON ata.author_id = au.author_id LEFT JOIN
grade gr
ON ar.article_id = gr.article_id
GROUP BY ag.article_group_id, au.author_id, au.author_name
) a
GROUP BY article_group_id;
请注意,这将作者聚合为数组而不是字符串。当然,如果愿意,可以使用字符串,但数组通常更干净、更通用。请添加一些示例数据和示例输出。这将有助于我们帮助您我已经尝试了您的原始评论。I get:错误:“平均总计”列不存在。我得到的只是错误。而且没有特定形式的数据进入。它只返回我为语法错误评论过的每一篇文章的有组织数组中的所有数据。如果您发布一些数据和样本输出,那么。我们可以发布正确的答案。请原谅,我不明白你所说的“样本输出”是什么意思。我得到的所有输出都是错误。你想让我写我期望输出的格式吗?是的。你期望输出的是什么。
SELECT article_group_id, array_agg( (author_id, author_name, avg_grade)) as authors,
SUM(total_grade) / SUM(num_grade) as group_avg
FROM (SELECT ag.article_group_id, au.author_id, au.author_name,
AVG(gr.total) as avg_grade,
SUM(gr.total) as total_grade,
COUNT(gr.total) as num_grade
FROM article_group ag LEFT JOIN
article ar
ON ar.article_group_id=ag.article_group_id LEFT JOIN
article_to_author ata
ON ar.article_id = ata.article_id LEFT JOIN
author au
ON ata.author_id = au.author_id LEFT JOIN
grade gr
ON ar.article_id = gr.article_id
GROUP BY ag.article_group_id, au.author_id, au.author_name
) a
GROUP BY article_group_id;