Агрегатная функция max_by

Область применения:отмечено 'да' Databricks SQL отмечено 'да' Databricks Runtime

Возвращает значение выражения, связанного с наибольшим значением второго выражения в группе. При использовании дополнительного третьего аргумента возвращает массив limit до значений, соответствующих наибольшим значениям выражения упорядочивания.

Синтаксис

max_by(expr, ordExpr) [FILTER ( WHERE cond ) ]
max_by(expr, ordExpr, limit) [FILTER ( WHERE cond ) ]

Эту функцию также можно вызвать как функцию окна с помощью предложения OVER.

Аргументы

  • expr: выражение, значение которого должно быть возвращено. Может быть любым типом данных.
  • ordExpr: выражение, используемое для определения максимального значения (ключа сортировки). Должен быть упорядоченным типом.
  • limit: (Необязательно) Значение INT , представляющее максимальное количество возвращаемых значений. Должно быть больше 0 и меньше или равно 100 000. При указании функция возвращает массив до значений limit .
  • cond: необязательное логическое выражение, фильтрующее строки, используемые для агрегирования.

Возвраты

Без limit: тип результата соответствует типу expr. Если несколько строк имеют одно и то же максимальное значение ordExpr, результат не детерминирован.

С limit: ARRAY значения, тип элемента которых соответствует типу expr. Массив содержит до limit элементов. Значения, соответствующие упорядочению NULL , не включаются. Если все значения упорядочения являются, результатом является NULLNULL. Если несколько строк имеют одинаковые самые большие значения, функция не детерминирована.

Заметка

Для определенных STRING колляций, таких как UTF8_LCASE, результат также может быть недетерминированным.

Примеры

> SELECT max_by(x, y, 2) FROM VALUES (('a', 10)), (('b', 50)), (('c', 20)) AS tab(x, y);
 [b, c]

-- Return top 2 values by ordering expression
> SELECT year, max_by(course, earnings, 2) FROM data GROUP BY year;
 year: 2012, max_by(course, earnings, 2): [Java, c]

> SELECT max_by(x, y COLLATE UTF8_LCASE) FROM VALUES (('a', 'X')), (('b', 'x')), (('c', 'v')) AS tab(x, y);
 a (or b)