sql - 为什么不能在下一个 SELECT 表达式中使用列别名?

标签 sql postgresql column-alias

我可以修改 next 以在表达式 ROUND(avg_time * cnt, 2) 中使用列别名 avg_timecnt 吗?

SELECT 
    COALESCE(ROUND(stddev_samp(time), 2), 0) as stddev_time, 
    MAX(time) as max_time, 
    ROUND(AVG(time), 2) as avg_time, 
    MIN(time) as min_time, 
    COUNT(path) as cnt, 
    ROUND(avg_time * cnt, 2) as slowdown, path
FROM 
    loadtime
GROUP BY
    path
ORDER BY
    avg_time DESC
LIMIT 10;

它会引发下一个错误:

ERROR:  column "avg_time" does not exist
LINE 7:  ROUND(avg_time * cnt, 2) as slowdown, path

然而,下一个工作正常(使用主表达式而不是列别名:

SELECT 
    COALESCE(ROUND(stddev_samp(time), 2), 0) as stddev_time, 
    MAX(time) as max_time, 
    ROUND(AVG(time), 2) as avg_time, 
    MIN(time) as min_time, 
    COUNT(path) as cnt, 
    ROUND(AVG(time) * COUNT(path), 2) as slowdown, path
FROM 
    loadtime
GROUP BY
    path
ORDER BY
    avg_time DESC
LIMIT 10;

最佳答案

您可以在 GROUP BY 中使用之前创建的别名或 HAVING声明,但不在 SELECT 中或 WHERE陈述。这是因为程序处理了所有 SELECT同时声明并且还不知道别名的值。

解决方案是将查询封装在子查询中,然后别名在外部可用。

SELECT stddev_time, max_time, avg_time, min_time, cnt, 
       ROUND(avg_time * cnt, 2) as slowdown
FROM (
        SELECT 
            COALESCE(ROUND(stddev_samp(time), 2), 0) as stddev_time, 
            MAX(time) as max_time, 
            ROUND(AVG(time), 2) as avg_time, 
            MIN(time) as min_time, 
            COUNT(path) as cnt, 
            path
        FROM 
            loadtime
        GROUP BY
            path
        ORDER BY
            avg_time DESC
        LIMIT 10
   ) X;

关于sql - 为什么不能在下一个 SELECT 表达式中使用列别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34955911/

相关文章:

Postgresql 创建扩展失败

mysql - 无法在 WHERE 子句中使用 SELECT 子句的别名

sql - 计算位于边界框内的点/坐标

java - Hibernate中连续命名参数问题(Spring HibernateTemplate)

sql - 聚合(分组依据)如何在 SQL Server 上工作?

java - 组织.postgresql.util.PSQLException : The connection attempt failed

sql - 无法在 Postgresql 中添加约束

postgresql - 列 "date_norm"在 Postgresql 中不存在

scala - 重命名 Spark DataFrame 中的嵌套结构列

sql - 带有 NOT IN 的多个 SELECT - 内部 Select 语句返回空,整个 SELECT 返回空