Sql 如何按别名为旧列的新创建列分组?

Sql 如何按别名为旧列的新创建列分组?,sql,postgresql,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_ta

我想修改保留旧列别名的列。但当我按它分组时,会发生错误

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.在“分组依据”条款中提供列号

SELECT number1-number2 AS number1  FROM some_table GROUP BY 1

有没有办法在没有上述解决方案的情况下以某种方式保留旧别名?

您可以使用
交叉应用

SELECT v.new_number
FROM some_table t CROSS APPLY
     (VALUES (t.number1 - t.number2)) v(new_number)
GROUP BY v.new_number;
您还可以执行以下操作:

SELECT v.number1
FROM some_table t CROSS APPLY
     (VALUES (t.number1 - t.number2)) v(number1)
GROUP BY v.number1

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

您的第二个查询是不完整的,使用与列名相等的别名会使其变得有些模糊。
SELECT
子句中定义的别名不能在
groupby
子句中使用,因为后者发生在前者之前。因此,你得到的是:

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
(当然,如果不进行任何聚合,这仍然毫无意义,但我知道,这只是一个例子:-)


无论如何,为别名重新使用列名仍然是个坏主意。想象一下,
按数字1排序
——那是指什么;列名还是别名?(我很确定别名在这里具有优先权,但我不知道SQL标准是否真的定义了它。)

您可以使用结果列编号而不是名称

例如:


您甚至不能在MS SQL Server中按新的\u编号分组。@SQL Hacks。你说得对,我忘了提到我在postgresql中测试过它
GROUP BY 2