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


Кажется, вам нужны оконные функции. Я бы пошел на:
SELECT ( (test - AVG(test) OVER () ) /
NULLIF(STDDEV_POP(test) OVER (), 0)
) AS test_normalized
FROM temp;
Это стандартизирует/нормализует значение test в каждой строке.
Я устал от AVG(test) OVER(), но все равно получаю сообщение об ошибке.
@ p1kas0 . . . В этом ответе нет агрегации в запросе, поэтому сообщение об ошибке не подходит.
Здесь неявная агрегация - из-за наличия функции агрегации AVG()
@МихаилБерлянт. . . В данном контексте это функция окно, а не функция агрегация. GROUP BY не нужен.
Извините, вы правы. Слишком быстро просмотрел запрос. Как насчет STDDEV_POP()?
Ой, извините еще раз - то же самое. Попробую сам, когда доберусь до ПК :о)
вы должны добавить OVER() ко всем экземплярам AVG (тест) и STDDEV_POP (тест) в своем заявлении.
хммм (тест - AVG(тест) OVER())/ STDDEV_POP(test) OVER() все еще не работает, такое же сообщение об ошибке
Ой, я забыл написать NULLIF() ! Попробовал и проблема решилась!! СПАСИБО !!
Прочтите Как спросить и предоставьте Минимальный, полный и проверяемый пример