SQL — получить среднее значение из числа

# #sql #google-bigquery

Вопрос:

как у тебя дела?

Я пытаюсь получить среднее значение от подсчета. Метрика-это строка, поэтому я получаю ошибку. Я пробовал некоторые способы, но не могу. Спасибо за вашу помощь

  • Это и есть код
 SELECT 
user_type, // works fine
newsletter, // works fine
COUNT (newsletter) as total, // Works fine 
AVG (newsletter) as percentage, // Error. No matching signature for aggregate function AVG: Supported signatures AVG(INT64), AVG(NUMERICAL), AVG (FLOAT64)

 

Это то, что я безуспешно пытался сделать

  • Среднее значение (информационный бюллетень) в процентах
  • Средний балл (в ролях (рассылка как INT64)) в процентах
  • ПОДСЧЕТ(информационный бюллетень) / СУММА(информационный бюллетень)

Я бы хотел получить такой столик

 user_type | newsletter | total | percentage
  free.        yes.       4.       x%
  premium.     yes.       7.       x%
 

Комментарии:

1. Среднее значение чего именно? Можете ли вы поделиться некоторыми примерами данных и желаемыми результатами? «Да» в качестве значения предполагает логическое значение, чтобы вы могли получить среднее значение (которое будет представлять собой некоторое число от 0 до 1), выполнив AVG(CASE WHEN newsletter = "Yes" THEN 1 ELSE 0 END) as average_newsletter_opt_in это, но неясно, это то, что вам нужно.

2. Если вы хотите усреднить набор строк, вам нужно сначала что-то сделать, чтобы преобразовать эти строки в числовые значения (в соответствии с вашей попыткой привести их к целому числу) . Поскольку строки не имеют никакого сходства с числовыми значениями, вам нужно самостоятельно сопоставить строковые значения с числовыми значениями, поэтому рекомендуется использовать что-то вроде CASE WHEN newsletter = 'yes.' THEN 1.0 ELSE 0.0 END , а затем усреднить это.

3. Привет, спасибо, что ответили. Я хотел бы получить процент от этих общих показателей. Например, 4 представляет 36%, а 7 представляет 64% извинений… Я не объяснил, как предполагал… Это в самый первый раз

Ответ №1:

Чтобы получить соотношение текущей строки ко всей таблице…

  • у вас уже есть значение для каждой отдельной строки
  • используйте оконные функции, чтобы получить общее значение для всей таблицы
  • затем разделите эти два

(С «окном» () для представления всей таблицы)

 x * 1.0 / SUM(x) OVER ()
 

В вашем случае, x это COUNT(newsletter) то, что дает…

 COUNT(newsletter) * 1.0 / SUM(COUNT(newsletter)) OVER ()
 

Комментарии:

1. Привет, Матбайли, Потрясающе! Спасибо, теперь стол выглядит идеально

Ответ №2:

Если вы хотите получить количество бюллетеней, имеющих значение yes , вы можете использовать case when выражение

 SELECT 
user_type, -- works fine
newsletter, -- works fine
COUNT (newsletter) as total, -- Works fine 
sum (case when newsletter ='yes' then 1 else 0 end) 
from yourtable
 

Комментарии:

1. Определенно. Вот почему я сразу же изменил свой ответ. Спасибо.