引用 SQL SELECT 中的其他列

Posted

技术标签:

【中文标题】引用 SQL SELECT 中的其他列【英文标题】:Referencing other columns in a SQL SELECT 【发布时间】:2021-03-08 12:25:02 【问题描述】:

我在 BigQuery 中有一个 SQL 查询:

SELECT
  creator.country,
  (SUM(length) / 60) AS total_minutes,
  COUNT(DISTINCT creator.id) AS total_users,
  (SUM(length) / 60 / COUNT(DISTINCT creator.id)) AS minutes_per_user
FROM
  ...

您可能已经注意到最后一列等同于total_minutes / total_users

我试过了,但它不起作用:

SELECT
  creator.country,
  (SUM(length) / 60) AS total_minutes,
  COUNT(DISTINCT creator.id) AS total_users,
  (total_minutes / total_users) AS minutes_per_user
FROM
  ...

有什么方法可以让这更简单吗?

【问题讨论】:

【参考方案1】:

不是真的。也就是说,您不能在同一个SELECT 的表达式中重复使用列别名。如果你真的想要,你可以使用子查询或 CTE:

SELECT c.*,
       total_minutes / total_users
FROM (SELECT creator.country,
             (SUM(length) / 60) AS total_minutes,
              COUNT(DISTINCT creator.id) AS total_users
      FROM
     ) c;

【讨论】:

【参考方案2】:

另一种选择是将度量计算的所有业务逻辑移动到 UDF 中(临时或永久取决于使用需求)...

create temp function custom_stats(arr any type) as ((
  select as struct    
    sum(length) / 60 as total_minutes,
    count(distinct id) as total_users,
    sum(length) / 60 / count(distinct id) as minutes_per_user
  from unnest(arr)
));

... 从而使查询本身保持简单且最少冗长 - 如下例所示

select creator.country,
  custom_stats(array_agg(struct(length, creator.id))).*
from `project.dataset.table`
group by country

【讨论】:

以上是关于引用 SQL SELECT 中的其他列的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 引用计算列

为啥我不能使用引用 SQL 中其他列的 checkConstraint 将列添加到现有表

在 FROM 子句中引用别名为表的其他 SQL SELECT 语句

更改计算列引用的 SQL 函数

Mybatis中的xml文件resultMap引用其他文件的resultMap

使用引用表 SQL Server 更新表中的多条记录