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