在 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有一个独特的DURATIONFOLDER有一个或多个STEPPRCEDURE 也有很多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) 子查询的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL+表分区:低效的 max() 和 min()

如何从另一个表中选择 MIN 和 MAX

PostgreSQL 常用函数

PostgreSQL 常用函数

在EXCEL中,如何使用MAX和MIN函数

C语言中“max”和“min”如何使用?