LIMIT n BY expressions выбирает первые n строк для каждого уникального значения expressions. Ключ для секции LIMIT BY может содержать любое количество expressions.
ClickHouse поддерживает следующие варианты синтаксиса:
LIMIT [offset_value, ]n BY expressionsLIMIT n OFFSET offset_value BY expressions
LIMIT n BY expressions и возвращает первые n строк для каждой уникальной комбинации expressions. Если указан OFFSET, то для каждого блока данных, относящегося к отдельной комбинации expressions, ClickHouse пропускает offset_value строк с начала блока и возвращает в результате не более n строк. Если offset_value превышает число строк в блоке данных, ClickHouse не возвращает из этого блока ни одной строки.
LIMIT BY не связана с LIMIT. Обе можно использовать в одном и том же запросе. Это относится и к форме диапазона LIMIT ... AFTER ... UNTIL, которая в таком случае применяется к строкам, оставленным LIMIT BY.Примеры
Пример таблицы:SELECT * FROM limit_by ORDER BY id, val LIMIT 2 OFFSET 1 BY id возвращает тот же результат.
Следующий запрос возвращает 5 лучших источников перехода для каждой пары domain, device_type при общем максимуме в 100 строк (LIMIT n BY + LIMIT).
LIMIT BY также поддерживает отрицательные лимиты и смещения. Как и в случае с отрицательной командой LIMIT, с LIMIT BY можно использовать отрицательные значения, чтобы выбирать строки с конца каждой группы.
id. Для id = 1 получаем строки 11 и 12; для id = 2 возвращаются обе строки, так как в группе всего 2 строки.
id: завершающий OFFSET -1 отбрасывает последнюю строку в каждой группе, а ведущий -1 затем оставляет последнюю строку из оставшихся.
Также можно сочетать LIMIT и OFFSET с разными знаками. Например, чтобы отбросить первую строку каждой группы, а затем оставить последние 2 из оставшихся:
id = 1 первая строка (10) пропускается; возвращаются обе последние строки — 11 и 12. Для id = 2 первая строка (20) пропускается, остаётся только 21.
LIMIT BY ALL
LIMIT BY ALL эквивалентен перечислению всех выражений в SELECT, которые не являются агрегатными функциями.
Например:
LIMIT BY будут включать максимально возможное количество неагрегатных полей, которые можно из неё извлечь.
Например:
Примеры
Пример таблицы:SELECT * FROM limit_by ORDER BY id, val LIMIT 2 OFFSET 1 BY id возвращает тот же результат.
С использованием LIMIT BY ALL: