google-bigquery - 向 BigQuery 查询添加“计算列”而不重复计算
问题描述
我想在新的第三列中重用计算列的值。例如,此查询有效:
select
countif(cond1) as A,
countif(cond2) as B,
countif(cond1)/countif(cond2) as prct_pass
From
Where
Group By
但是当我尝试使用 A,B 而不是重复计数时,它不起作用,因为 A 和 B无效:
select
countif(cond1) as A,
countif(cond2) as B,
A/B as prct_pass
From
Where
Group By
我可以以某种方式使更具可读性的第二个版本工作吗?这是第一个效率低下吗?
解决方案
您应该构造一个子查询(即双重选择),例如
SELECT A, B, A/B as prct_pass
FROM
(
SELECT countif(cond1) as A,
countif(cond2) as B
FROM <yourtable>
)
两个查询将处理相同数量的数据。在子查询中,您将只执行 2 个 countif(),如果该步骤需要很长时间,那么执行 2 而不是 4 确实应该更有效。
查看使用 bigquery 公共数据集的示例:
SELECT
countif(homeFinalRuns>3) as A,
countif(awayFinalRuns>3) as B,
countif(homeFinalRuns>3)/countif(awayFinalRuns>3) as division
FROM `bigquery-public-data.baseball.games_post_wide`
或者
SELECT A, B, A/B as division FROM
(
SELECT countif(homeFinalRuns>3) as A,
countif(awayFinalRuns>3) as B
FROM `bigquery-public-data.baseball.games_post_wide`
)
我们可以看到,多合一(没有子查询)实际上要快一些。(我针对不等式的不同值运行了 6 次查询,5 次快,1 次慢)
在任何情况下,效率都取决于计算特定数据集中条件的方式。
推荐阅读
- c++ - 添加成员变量的子类的构造
- python - 在python中合并两个字典列表
- html - Div 填充有白色透明背景,边缘完全透明
- adfs - 除非授权或登录,否则如何将ckan重定向到外部url
- node.js - plesk 使用通用 API 托管多个站点
- intellij-idea - Jboss 6 部署错误
- java - Android Studio - 将目标兼容性设置为 JDK 1.8 后,Gradle 构建失败
- php - 使用 array_diff 和 ajax 时数组到字符串的转换错误
- java - 在多线程中仅从 LinkedList 中删除一次
- postsharp - 如何从方法中访问属性数据