【问题标题】:Still confusing the rules around selecting columns, group by, and joins仍然混淆选择列、分组依据和连接的规则
【发布时间】:2021-05-21 03:56:13
【问题描述】:

我仍然对使用GROUP BY 的语法规则感到困惑。我知道当有一些聚合函数时我们使用GROUP BY。如果我在 SQL 语句中甚至有一个聚合函数,我是否需要将所有选定的列放入我的 GROUP BY 语句中?我没有要询问的特定查询,但是当我尝试进行联接时,出现错误。特别是,当我在语句和/或连接中使用 count(*) 时,我似乎把它搞砸了。

我在工作中使用 BigQuery。我经常被知识上的奇怪差距弄得不知所措。

谢谢!

【问题讨论】:

  • 显然,不同 RDBMS 之间的语法可能略有不同,但是 - 作为一般规则 - 任何属于 SELECT 语句但未聚合的列都需要包含在 GROUP BY 中。如果您随后开始合并表连接,那么它可能会更加复杂,具体取决于您的预期结果。你说你没有特定的查询,但你也说你得到了错误——所以你必须有正在运行的查询,这些查询会产生错误。最好包含一个示例查询,然后您可以获得一些更具体的建议
  • 谢谢!当我再次遇到它时,我会更新一个查询。谢谢!

标签: sql group-by syntax


【解决方案1】:

这有点复杂。

首先,聚合查询中不需要聚合函数。所以这是允许的:

select a
from t
group by a;

顺便说一句,这相当于:

select distinct a
from t;

如果有聚合函数,则不需要group by。所以,这是允许的:

select max(a)
from t;

这样的聚合查询——没有group by——总是返回一行。即使表为空或where 子句过滤掉所有行也是如此。在这种情况下,大多数聚合函数都返回NULL,但count() 的显着例外是返回0

接下来,如果您在select 中混合使用聚合函数和非聚合表达式,那么通常您希望在group by 中使用非聚合、非常量表达式。我应该注意到你可以这样做:

select a, concat(a, 'bcd'), count(*)
from t
group by a;

这应该可行,但有时 BigQuery 会感到困惑,并需要 group by 中的表达式。

最后,SQL 标准支持这样的查询:

select t.*, count(*)
from t join
     u
     using (foo)
group by t.a;

at 中的主键(或等效键)时。但是,BigQuery 没有主键,因此与该数据库无关。

【讨论】:

  • 谢谢!我很感激。
  • “t.*”是一种提取给定表的所有记录的方法吗?我不熟悉这种结构。谢谢!
  • @lillemongrab 。 . . t.* 是一种拉入t 所指的所有 的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-13
  • 1970-01-01
  • 2015-02-09
  • 1970-01-01
  • 2012-02-11
相关资源
最近更新 更多