GROUP BY 是否发生在 SELECT 语句中发生的操作之后?(大查询)

Does the GROUP BY occur after the operations that occur in the SELECT statement? (BigQuery)

提问人:164_user 提问时间:3/30/2023 更新时间:4/1/2023 访问量:182

问:

从我所读到的,例如 我知道SQL语句将按以下顺序执行:https://www.sisense.com/blog/sql-query-order-of-operations/

1:发件人,2:其中,3:分组依据,4:HAVINIG,5:选择,6:订购依据,7:限制

这对我来说是有道理的,除了您可以对在 SELECT 语句中创建的新列进行 GROUP BY 这一事实。例如:

WITH data_sample AS (
   SELECT "m1" as meter, 2 as value UNION ALL 
   SELECT "m1" as meter, 3 as value, UNION ALL 
   SELECT "m1" as meter, 5 as value, UNION ALL
   SELECT "m1" as meter, 5 as value UNION ALL
   SELECT "m2" as meter, 4 as value UNION ALL
   SELECT "m2" as meter, 6 as value UNION ALL 
   SELECT "m3" as meter, 4 as value UNION ALL
   SELECT "m3" as meter, 4 as value )


SELECT IF(meter="m1", meter, "m7") as meter_new, SUM(value)
FROM data_sample
GROUP BY meter_new

在这里,在 SELECT 语句中创建的新列已经可供 GROUP BY 使用(这让我认为 SELECT 在 GROUP BY 之前执行),但此分组随后用于 SUM 语句,该语句位于查询的 SELECT 部分,使 SELECT 似乎也发生在 GROUP BY 之后。meter_new

显然我在这里遗漏了一些东西,但谷歌搜索只是不断返回相同的有序操作列表,这对我没有帮助。

SQL Group-by Google-BigQuery 执行顺序

评论

0赞 jarlh 3/30/2023
严格来说,不能对在 SELECT 子句中创建的 GROUP BY 列进行 GROUP BY。但是有些产品在这里作弊......
0赞 Arvo 3/30/2023
你不能完全谈论SQL语句的执行顺序 - SQL服务器可以自由地以任何顺序或并行进行子操作,只是结果需要是正确的。
0赞 Arvo 3/30/2023
关于您的问题 - bigquery 很可能会从查询的 select 部分替换为其源表达式 ()。不是标准的 SQL 功能。meter_newIF(meter="m1", meter, "m7")
0赞 SQLpro 3/30/2023
@Arvo,谷歌大查询和MySQL的这个技巧useb大多是愚蠢的,因为如果查询使用的表中的任何列的名称与表达式的SELECT原因中给出的别名完全相同,就会有混淆......
0赞 kiran mathew 3/31/2023
嗨@164_user这个链接 1link2 对你有帮助吗?

答:

1赞 kiran mathew 4/1/2023 #1

BigQuery的执行顺序与一般的RDBMS完全不同。

BigQuery 使用 Dremel 查询引擎来执行查询。Dremel 使用多级服务树来执行查询。根服务器接收传入的查询,从表中读取元数据,并将查询路由到服务树中的下一级。您可以从此链接1link2 详细了解 BigQuery 的工作原理。

您可以使用查询计划说明检查查询的执行顺序。

enter image description here