Добавление «вычисляемого столбца» в запрос BigQuery без повторения вычислений - PullRequest
0 голосов
/ 14 июля 2020

Следующий запрос достигает моей цели:

select
  countif(cond1) as A,
  countif(cond2) as B,
  countif(cond1)/countif(cond2) as prct_pass
  From 
  Where
  Group By

Но когда я пытаюсь использовать A, B вместо повторения counttif, он не работает, потому что A и B являются недействительными :

select
  countif(cond1) as A,
  countif(cond2) as B,
  A/B as prct_pass
  From 
  Where
  Group By

Можно как-нибудь заставить работать более читаемую вторую версию? Этот первый неэффективен?

1 Ответ

0 голосов
/ 14 июля 2020

Вы должны создать подзапрос (т.е. двойной выбор), например

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 publi c наборов данных :

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 раз быстрее и один раз медленнее)

В любом случае эффективность будет зависеть от того, насколько облагается налогом вычисление условия в вашем конкретном наборе данных.

...