Перейти к основному содержимому

approx_top_k

Описание

Возвращает топ k наиболее часто встречающихся значений элементов в expr вместе с их приблизительными подсчетами.

Эта функция поддерживается начиная с версии 1.5.0.

Синтаксис

APPROX_TOP_K(<expr> [ , <k> [ , <counter_num> ] ] )

Аргументы

  • expr: Выражение типа STRING, BOOLEAN, DATE, DATETIME или числового типа.

  • k: Необязательный INTEGER литерал больше 0. Если k не указан, по умолчанию используется значение 5. Максимальное значение — 100000.

  • counter_num: Необязательный INTEGER литерал больше или равный k. Чем больше counter_num, тем точнее будет результат. Однако это также приводит к увеличению затрат CPU и памяти.

    • Максимальное значение — 100000.
    • Если counter_num не указан, по умолчанию используется max(min(2 * k, 100), 100000).

Возвращаемое значение

Результаты возвращаются как ARRAY типа STRUCT, где каждый STRUCT содержит поле item для значения (с его исходным типом ввода) и поле count (типа BIGINT) с приблизительным количеством вхождений. Массив отсортирован по count в убывающем порядке.

Агрегатная функция возвращает топ k наиболее часто встречающихся значений элементов в выражении expr вместе с их приблизительными подсчетами. Ошибка в каждом подсчете может составлять до 2.0 * numRows / counter_num, где numRows — общее количество строк. Более высокие значения counter_num обеспечивают лучшую точность за счет увеличения использования памяти. Выражения, которые имеют менее counter_num различных элементов, дадут точные подсчеты элементов. Результаты включают значения NULL как отдельный элемент в результатах.

Примеры

Используем данные из таблицы scores в качестве примера.

-- Вычислить распределение оценок по каждому предмету.
MySQL > SELECT subject, APPROX_TOP_K(score) AS top_k FROM scores GROUP BY subject;
+---------+--------------------------------------------------------------------------------------------------------------------+
| subject | top_k |
+---------+--------------------------------------------------------------------------------------------------------------------+
| physics | [{"item":99,"count":2},{"item":null,"count":1},{"item":100,"count":1},{"item":85,"count":1},{"item":60,"count":1}] |
| english | [{"item":null,"count":1},{"item":92,"count":1},{"item":98,"count":1},{"item":100,"count":1},{"item":85,"count":1}] |
| NULL | [{"item":90,"count":1}] |
| math | [{"item":80,"count":2},{"item":null,"count":1},{"item":92,"count":1},{"item":95,"count":1},{"item":70,"count":1}] |
+---------+--------------------------------------------------------------------------------------------------------------------+

-- Вычислить распределение оценок по предмету математика.
MySQL > SELECT subject, APPROX_TOP_K(score) AS top_k FROM scores WHERE subject IN ('math') GROUP BY subject;
+---------+-------------------------------------------------------------------------------------------------------------------+
| subject | top_k |
+---------+-------------------------------------------------------------------------------------------------------------------+
| math | [{"item":80,"count":2},{"item":null,"count":1},{"item":95,"count":1},{"item":92,"count":1},{"item":70,"count":1}] |
+---------+-------------------------------------------------------------------------------------------------------------------+

keyword

APPROX_TOP_K