列名似乎在GROUP BY中代替了别名

时间:2019-03-03 08:31:31

标签: postgresql

对于一个项目,我希望按天获取所有结果。

这是我的查询:

SELECT MAX(id) AS id, 
       SUM(value) AS value, 
       country, 
       cast(TO_CHAR(date, 'dd/mm/yyyy') AS DATE) AS date 
FROM records 
GROUP BY date, country

我的问题是,当我使用“日期”别名时,记录没有正确分组,而是按字段名称分组。

按别名分组的结果

Results with group by alias

如果我使用索引而不是别名,则可以使用,但是我想在结果中使用列名:

SELECT MAX(id) AS id, 
       SUM(value) AS value, 
       country, 
       cast(TO_CHAR(date, 'dd/mm/yyyy') AS DATE) AS date 
FROM records 
GROUP BY 3, 4

按索引分组的结果

Results with group by indices

有人知道为什么这样工作吗?

2 个答案:

答案 0 :(得分:0)

Quote from the manual

  

grouping_element内部使用的表达式可以是输入列名称,也可以是输出列(SELECT列表项)的名称或序号,或者是由输入列值组成的任意表达式。 如有歧义,GROUP BY名称将被解释为输入列名称,而不是输出列名称

(重点是我的)

因此,(输入)列名称始终优先于列别名。

答案 1 :(得分:0)

两个GROUP BY子句不相同。

两者中的SELECT子句是:

SELECT
    MAX(id) AS id, 
    SUM(value) AS value, 
    country, 
    cast(TO_CHAR(date, 'dd/mm/yyyy') AS DATE) AS date

因此列将为(idvaluecountrydate)。

第一个查询按date然后country分组:

GROUP BY date, country

第二组依次为countrydate

GROUP BY 3, 4

使用GROUP BY的不同层次结构,您将获得不同的结果,例如显示的结果。