Перейти к основному содержимому
Версия: 2.0.x

approx_top_k

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

Эта функция поддерживается начиная с версии 3.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}] |
+---------+-------------------------------------------------------------------------------------------------------------------+

Ключевое слово

APPROX_TOP_K