Нормализация (статика) в bigquery: как исправить код, чтобы получить нормализованные числа?

Я хочу нормализовать данные в bigquery но я получил сообщение об ошибке, как показано ниже: «Выражение списка SELECT ссылается на тест столбца, который не сгруппирован и не агрегирован» и (test- AVG(test)) подчеркнуто.

Я знаю, что Python или другой инструмент легко нормализует данные но я должен сделать это в bigquery.

Как мне изменить этот код?

SELECT 
  CASE WHEN STDDEV_POP(test) IS NOT NULL AND STDDEV_POP(test) > 0
  THEN
   (test - AVG(test))/ STDDEV_POP(test)
  ELSE
   NULL
  END AS test_normalized
FROM temp

Прочтите Как спросить и предоставьте Минимальный, полный и проверяемый пример

Mikhail Berlyant 25.01.2019 02:06

Я не знаю BigQuery. Но если он поддерживает оконные функции, вы должны иметь возможность просто добавить OVER() после ваших агрегатов, чтобы избежать этого синтаксического ограничения.

Error_2646 25.01.2019 02:08

Кроме того, стоит прямо указать, что вы говорите о нормализации в статистическом, а не в теоретическом смысле базы данных.

Error_2646 25.01.2019 02:16
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
3
2 241
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кажется, вам нужны оконные функции. Я бы пошел на:

SELECT ( (test - AVG(test) OVER () ) / 
         NULLIF(STDDEV_POP(test) OVER (), 0) 
       ) AS test_normalized
FROM temp;

Это стандартизирует/нормализует значение test в каждой строке.

Я устал от AVG(test) OVER(), но все равно получаю сообщение об ошибке.

p1kas0 25.01.2019 05:10

@ p1kas0 . . . В этом ответе нет агрегации в запросе, поэтому сообщение об ошибке не подходит.

Gordon Linoff 25.01.2019 05:13

Здесь неявная агрегация - из-за наличия функции агрегации AVG()

Mikhail Berlyant 25.01.2019 05:35

@МихаилБерлянт. . . В данном контексте это функция окно, а не функция агрегация. GROUP BY не нужен.

Gordon Linoff 25.01.2019 05:36

Извините, вы правы. Слишком быстро просмотрел запрос. Как насчет STDDEV_POP()?

Mikhail Berlyant 25.01.2019 05:38

Ой, извините еще раз - то же самое. Попробую сам, когда доберусь до ПК :о)

Mikhail Berlyant 25.01.2019 05:39

вы должны добавить OVER() ко всем экземплярам AVG (тест) и STDDEV_POP (тест) в своем заявлении.

Mikhail Berlyant 25.01.2019 07:42

хммм (тест - AVG(тест) OVER())/ STDDEV_POP(test) OVER() все еще не работает, такое же сообщение об ошибке

p1kas0 25.01.2019 07:45

Ой, я забыл написать NULLIF() ! Попробовал и проблема решилась!! СПАСИБО !!

p1kas0 25.01.2019 07:51

Другие вопросы по теме