# #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. Определенно. Вот почему я сразу же изменил свой ответ. Спасибо.