LISTAGG 함수
LISTAGG 함수
Apache Pinot의 LISTAGG 집계 함수는 여러 행의 문자열 값들을 하나의 구분자로 연결된 문자열로 모아줘요. 구분자를 지정할 수 있고(기본값은 쉼표), 선택적으로 DISTINCT 키워드를 쓰면 고유한 값만 포함할 수 있어요.
출처: 문서
본문
LISTAGG 함수는 행들의 문자열 값을 단일 구분 문자열로 집계해요. 선택적으로 구분자를 지정할 수 있고(기본값은 쉼표), 선택적 DISTINCT 키워드로 고유한 값만 포함할 수 있어요.
시그니처
LISTAGG(colName)
LISTAGG(colName, delimiter)
LISTAGG(DISTINCT colName, delimiter)
WITHIN GROUP 절
WITHIN GROUP (ORDER BY ...) 절을 쓰면 연결된 결과에서 값들의 순서를 제어할 수 있어요. 이 절이 없으면 값의 순서는 정의되지 않아요.
LISTAGG(colName, delimiter) WITHIN GROUP (ORDER BY sortCol)
LISTAGG(DISTINCT colName, delimiter) WITHIN GROUP (ORDER BY sortCol)
{% hint style="info" %}
WITHIN GROUP 절은 멀티스테이지 쿼리 엔진(multi-stage query engine, v2) 을 요구해요. Apache Pinot 1.2.0에서 도입됐어요 (#13146).
쿼리당 단 하나의 WITHIN GROUP 절만 지원돼요.
{% endhint %}
사용 예시
아래 예시는 Batch Quick Start를 기반으로 해요.
기본 집계
select LISTAGG(league, '/') AS value
from baseballStats
WHERE playerName = 'Barry Bonds'
| value |
|---|
| NL/NL/NL/NL/NL/NL/NL/NL/NL/NL/... |
고유 값
select LISTAGG(DISTINCT league, ', ') AS value
from baseballStats
WHERE playerName = 'Barry Bonds'
| value |
|---|
| NL, AL |
WITHIN GROUP을 이용한 정렬 집계
각 출발지–목적지 쌍에 대해 항공사를 알파벳 순으로 연결해요:
SELECT Origin, Dest,
LISTAGG(DISTINCT Carrier, ', ') WITHIN GROUP (ORDER BY Carrier) AS carriers
FROM airlineStats
GROUP BY Origin, Dest
| Origin | Dest | carriers |
|---|---|---|
| SFO | LAX | AA, DL, UA, … |
| JFK | BOS | B6, DL, … |
GROUP BY를 이용한 정렬 집계
SELECT teamID,
LISTAGG(playerName, ' | ') WITHIN GROUP (ORDER BY playerName) AS players
FROM baseballStats
GROUP BY teamID
| teamID | players |
|---|---|
| PIT | Barry Bonds | Bobby Bonilla | … |