我一直在尝试理解Coursera上BigQuery课程的一部分的代码。查询看起来像这样
SELECT
CONCAT(fullVisitorId, CAST(visitID AS STRING)) AS unique_session_id,
sessionQualityDim,
SUM(productRevenue) AS transactions_revenue
FROM
transaction_table
WHERE sessionQualityDim > 60
GROUP BY unique_session_id, sessionQualityDim
我的问题是,SQL语句的顺序将如何执行。主要是当GROUP BY在unique_session_id(这是两列之间的CONCAT)上完成时,“ GROUP BY”将如何知道计算出的CONCAT结果(unique_session_id)。据我所知,SELECT语句将在最后运行。但是在这种情况下,似乎第一个字段是使用CONCAT计算的,然后使用该字段进行分组。有人可以对此提供更多见解吗?
答案 0 :(得分:4)
根据SQL标准,在GROUP BY
之前解析SELECT
。
但是,这并不是数据库之间的一成不变的规则。 BigQuery正在做的是从SELECT
确定列别名。然后,它在GROUP BY
中允许这些别名。其他数据库也可以这样做-例如Postgres及其所有派生数据库。
不过,请不要将查询的解析与执行混淆。通过一些非常复杂的并行有向无环图来执行。此处发生的仅仅是,BigQuery解析器(方便地)允许用户使用GROUP BY
中的表别名。