以下声明适用于我的数据库:
select column_a, count(*) from my_schema.my_table group by 1;
但这个没有:
select column_a, count(*) from my_schema.my_table;
我收到错误:
错误:列“my_table.column_a”必须出现在GROUP BY子句中 或用于聚合函数
有用的提示:此主题:What does SQL clause "GROUP BY 1" mean?讨论“group by 1
”的含义。
我感到困惑的原因是因为我经常看到count(*)
如下:
select count(*) from my_schema.my_table
其中有没有 group by
声明。 COUNT
是否始终需要group by
?在这种情况下隐含group by
语句吗?
答案 0 :(得分:2)
这个错误非常有意义。 COUNT
是一个“聚合”函数。所以你需要告诉它聚合哪个字段,这是用GROUP BY
子句完成的。
在你的情况下可能最有意义的那个是:
SELECT column_a, COUNT(*) FROM my_schema.my_table GROUP BY column_a;
如果仅使用COUNT(*)
子句,则要求返回完整的行数,而不是按其他条件聚合。在这种情况下你的GROUP BY
是隐含的,可以回答:“排序”:如果你没有指定任何东西有点像问:“一无所有”,这意味着你会得到一个巨大的聚合,这是整个表格。
例如,执行:
SELECT COUNT(*) FROM table;
将显示该表中的行数,而:
SELECT col_a, COUNT(*) FROM table GROUP BY col_a;
将显示col_a
的行值的行数。类似的东西:
col_a | COUNT(*)
---------+----------------
value1 | 100
value2 | 10
value3 | 123
您还应该考虑到*
意味着计算所有内容。包括NULL
s!如果要计算特定条件,则应使用COUNT(expression)
!有关此主题的详细信息,请参阅the docs about aggragate functions。
答案 1 :(得分:1)
如果您拥有count
,sum
等功能,则需要对其他列进行分组。这相当于您的查询:
select column_a, count(*) from my_schema.my_table group by column_a;
当您使用count(*)
而没有其他列时,您将从表中计算SELECT *
的所有行。当您在另一列旁边使用count(*)
时,您将计算该另一列的每个不同值的行数。因此,在这种情况下,您需要对结果进行分组,以便仅显示每个值及其计数一次。
答案 2 :(得分:1)
如果您根本不使用Group by子句,那么将返回的所有内容都是每行的计数1,无论如何都已经假设,因此是冗余数据。通过添加GROUP BY 1,您已对信息进行了分类,从而使其成为非冗余信息,即使它在理论上返回与创建错误的语句相同的结果。
答案 3 :(得分:1)
group by 1
是指column_a
,其中您的查询中的列位置为1。
这就是为什么它适用于您的服务器。事实上,这在sql中并不是一个好习惯。 您应该提及列名,因为列顺序可能会在表中更改,因此很难维护此代码。
最佳解决方案是:
select column_a, count(*) from my_schema.my_table group by column_a;