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 | …

더 알아보기 (Learn more)