LIMIT BY 절
LIMIT n BY expressions 절이 있는 쿼리는 expressions의 각 고유 값마다 처음 n개의 행을 선택합니다. LIMIT BY의 키에는 표현식을 임의의 개수만큼 포함할 수 있습니다.
ClickHouse는 다음과 같은 구문 형태를 지원합니다:
LIMIT [offset_value, ]n BY expressionsLIMIT n OFFSET offset_value BY expressions
쿼리를 처리할 때 ClickHouse는 정렬 키에 따라 정렬된 데이터를 선택합니다. 정렬 키는 ORDER BY 절을 사용해 명시적으로 설정하거나, 테이블 엔진의 속성으로 암묵적으로 설정됩니다(행 순서는 ORDER BY를 사용할 때만 보장되며, 그렇지 않으면 멀티 스레딩으로 인해 행 블록이 정렬되지 않을 수 있습니다). 그런 다음 ClickHouse는 LIMIT n BY expressions를 적용하고 expressions의 각 고유 조합에 대해 처음 n개의 행을 반환합니다. OFFSET이 지정된 경우, expressions의 각 고유 조합에 속하는 데이터 블록마다 블록의 시작에서 offset_value개 만큼 행을 건너뛰고 결과로 최대 n개의 행을 반환합니다. offset_value가 데이터 블록의 행 수보다 크면 ClickHouse는 해당 블록에서 행을 하나도 반환하지 않습니다.
LIMIT BY는 LIMIT과 관련이 없습니다. 둘 다 같은 쿼리에서 함께 사용할 수 있습니다.
LIMIT BY 절에서 컬럼 이름 대신 컬럼 번호를 사용하려면 enable_positional_arguments 설정을 활성화하십시오.
예시
예제 테이블:
쿼리:
SELECT * FROM limit_by ORDER BY id, val LIMIT 2 OFFSET 1 BY id 쿼리는 같은 결과를 반환합니다.
다음 쿼리는 각 domain, device_type 조합마다 상위 5개의 referrer를 반환하며, 전체 행 수를 최대 100개로 제한합니다 (LIMIT n BY + LIMIT).
LIMIT BY는 음수 LIMIT 및 OFFSET과도 함께 사용할 수 있습니다. 음수 LIMIT 절과 마찬가지로, LIMIT BY에서도 음수 값을 사용하여 각 그룹의 끝에서 행을 선택할 수 있습니다.
각 id에 대해 마지막 2개 행을 반환합니다. id = 1의 경우 11과 12 행이 반환되고, id = 2의 경우 그룹에 행이 2개뿐이므로 두 행이 모두 반환됩니다.
각 id별로 끝에서 두 번째 행을 반환합니다. 뒤의 OFFSET -1은 각 그룹에서 마지막 행을 제외하고, 앞의 -1은 그 후 남은 행들 중 마지막 행을 유지합니다.
부호가 다른 LIMIT와 OFFSET도 함께 사용할 수 있습니다. 예를 들어, 각 그룹의 첫 번째 행을 제외한 다음 남은 행들 중 마지막 2개를 유지하려면 다음과 같습니다:
id = 1의 경우 첫 번째 행(10)은 건너뛰고, 11, 12 중 마지막 2개를 모두 반환합니다. id = 2의 경우 첫 번째 행(20)을 건너뛰면 21만 남습니다.
LIMIT BY ALL
LIMIT BY ALL은 집계 함수가 아닌, SELECT 절의 모든 표현식을 나열하는 것과 동일하게 동작합니다.
예를 들면 다음과 같습니다:
와 동일합니다
집계 함수와 다른 필드를 동시에 인수로 사용하는 FUNCTION이 있는 특수한 경우에는, 해당 FUNCTION에서 추출할 수 있는 비집계 필드를 가능한 한 많이 LIMIT BY 키에 포함합니다.
예를 들어, 다음과 같습니다:
와 동일합니다
예시
예제 테이블:
쿼리:
SELECT * FROM limit_by ORDER BY id, val LIMIT 2 OFFSET 1 BY id 쿼리도 동일한 결과를 반환합니다.
LIMIT BY ALL 사용 예:
이는 다음과 동일합니다: