我可以修改 next 以在表达式 ROUND(avg_time * cnt, 2)
中使用列别名 avg_time
和 cnt
吗?
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/