在 postgresql 中使用 MIN, MAX, (SUM/COUNT) 子查询
Posted
技术标签:
【中文标题】在 postgresql 中使用 MIN, MAX, (SUM/COUNT) 子查询【英文标题】:Using MIN, MAX, (SUM/COUNT) subquery in postgresql 【发布时间】:2016-08-13 17:16:52 【问题描述】:我有这个 FACT_TABLE :
STEP有一个独特的DURATION,FOLDER有一个或多个STEP,PRCEDURE 也有很多FOLDER。
我想得到这个RESULT,使用SQL PostgreSQL Query,这意味着获取文件夹的最小总和持续时间,文件夹的最大总和持续时间以及按PRCEDURE
我尝试使用子查询来解决它:
SELECT PROCEDURE.NAME, min(DUR), MAX(DUR), (SUM(DUR)/COUNT(DISTINCT ID_FOLDER))
from
(SELECT ID_FOLDER, SUM (DURATION) as DUR from FACT_TABLE
group by ID_FOLDER)
Inner join PROCEDURE on PROCEDURE.ID = FACT_TABLE.ID_PROCEDURE
GROUP By PROCEDURE.NAME ;
但它没有用,我错过了什么吗?这个逻辑有什么问题?
【问题讨论】:
怎么没用?提供说明问题的示例数据和结果。 嗯,我的连接函数有问题,它不起作用,我不知道为什么他不知道。此外,当我在子查询中执行 group by 时,pgAdmin 中的错误 【参考方案1】:您的查询背后的想法应该有效。有一些调整:
SELECT p.NAME, MIN(pf.DUR), MAX(pf.DUR), AVG(pf.DUR)
FROM (SELECT f.ID_PROCEDURE, f.ID_FOLDER, SUM(f.DURATION) as DUR
FROM FACT_TABLE f
GROUP BY f.ID_PROCEDURE, f.ID_FOLDER
) pf JOIN
PROCEDURE p
ON p.ID = pf.ID_PROCEDURE
GROUP BY p.NAME;
注意:
子查询中包含ID_PROCEDURE
,所以可以用于join,聚合是正确的。
所有表的表别名定义。
使用限定的列名来避免歧义。
使用更简单的AVG()
而不是SUM()
与COUNT()
的比率。
【讨论】:
以上是关于在 postgresql 中使用 MIN, MAX, (SUM/COUNT) 子查询的主要内容,如果未能解决你的问题,请参考以下文章