sql - 如何使用旧列的别名对新创建的列进行分组?

标签 sql postgresql

我想修改保留旧列别名的列。但是当我对其进行分组时会发生错误。

CREATE TABLE some_table (
 number1 integer,
 number2 integer,
 name text
)

有了新的别名就可以了:

SELECT number1-number2 AS new_number FROM some_table GROUP BY new_number

但是一旦我想保留旧的列名:

SELECT number1-number2 AS number1 FROM some_table group by number1

列“some_table.number2”必须出现在 GROUP BY 子句中或用于聚合函数

我可以通过两种方式解决这个问题:

1.将其包装在另一个选择下

SELECT new_number AS  number1 FROM (
SELECT number1-number2 AS new_number  FROM some_table GROUP BY new_number) AS query

2.在'group by'子句中提供列号

SELECT number1-number2 AS number1  FROM some_table GROUP BY 1

如果没有上面提供的解决方案,是否有办法以某种方式保留旧别名?

最佳答案

您的原始查询是编写此类查询的最佳方式。您应该始终使用与列名不同的别名。

您的第二个查询不完整,使用与列名相等的别名有点混淆。 SELECT 子句中定义的别名不能用在 GROUP BY 子句中,因为后者发生在前者之前。所以你拥有的是:

SELECT number1-number2 AS number1 FROM some_table
GROUP BY some_table.number1

当你需要的时候

SELECT number1-number2 AS number1 FROM some_table
GROUP BY some_table.number1, some_table.number2

或者没有表限定符:

SELECT number1-number2 AS number1 FROM some_table 
GROUP BY number1, number2

(当然,如果没有任何聚合发生,这仍然几乎没有任何意义,但我知道,这只是一个例子:-)

无论如何,重新使用列名作为别名仍然不是一个好主意。想象一下 ORDER BY number1 - 它指的是什么;列名或别名? (我很确定别名在这里具有优先权,但我不知道 SQL 标准是否真的定义了这一点。)

关于sql - 如何使用旧列的别名对新创建的列进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53176900/

相关文章:

c# - 当我什么都得不到时却得到空洞的答案

postgresql - heroku pg :pull password authentication failed

python - 使用 Flask 和 Python 的 Heroku Postgres 数据库

sql - 在 NUMBER 列的 IN 子句中使用逗号分隔值

mysql - 我应该有一个表来获取下拉值还是为每个下拉列表创建多个表

java - Java 中 MySQL Callable 语句为 null

sql - 如何连接两个表 A 和 B 以获得 A 中的非连接列且数据不在 B 中?

excel - 在 AWS Redshift 中禁用 OID

ruby-on-rails - ActiveRecord::PendingMigrationError - 从一台服务器迁移到另一台

sql - 如何将文件批量插入到文件名是变量的*临时*表中?