无法识别列别名

问题描述

这个最小的例子应该从时间戳中提取年份,然后计算给定年份中的一些东西。

SELECT EXTRACT(YEAR FROM rental_ts) as year,COUNT(disTINCT rental_id)
FROM rental
GROUP BY year
HAVING year=2020

运行它,我收到错误 column "year" does not exist。这是什么原因?

  • 带有显式 HAVING EXTRACT(YEAR FROM rental_ts)=2020代码可以正常工作,但不是很方便。
  • 如果我在 year 子句中使用 WHERE 也会发生同样的情况。
  • 我在this playground练习。它使用 Postgresql

解决方法

唉,确实如此。不允许使用列别名。一种解决方案是重复表达式:

SELECT EXTRACT(YEAR FROM rental_ts) as year,COUNT(DISTINCT rental_id)
FROM rental
GROUP BY year
HAVING EXTRACT(YEAR FROM rental_ts) = 2020;

更好的解决方案是在聚合之前过滤

SELECT EXTRACT(YEAR FROM rental_ts) as year,COUNT(DISTINCT rental_id)
FROM rental
WHERE rental_ts >= '2020-01-01' AND rental_ts < '2021-01-01'
GROUP BY year;

这更好有两个原因。首先,它是索引(和分区)兼容的。其次,它减少了聚合所需的数据量。