2017-03-08 4 views
1

내가 적색 편이에 큰 테이블을 피벗 방법을 다음입니다 : AWS Redshift에 피벗 테이블 모든 치수

Pivot a table with Amazon RedShift/PostgreSQL

그러나 내가 피벗 많은 수의 그룹을 가지고 즉, m1, m2, ... 모든 고유 값을 반복하고 각각에 동일한 논리를 적용하고 결과 열 이름의 별명을 지정하는 방법은 무엇입니까?

+1

내가 아는 한, 당신은 할 수 없습니다. 일부 스크립팅을 통해 각 고유 metricName에 대한 case 문을 생성하거나 정직하게 수식을 사용하여 한 번만 쿼리를 수행하면됩니다. – htf

답변

1

임의의 수의 그룹으로 피벗 할 수 있도록하려는 경우 그룹을 JSON 문자열로 결합한 다음 Redshift JSON functions으로 관심있는 그룹을 추출 할 수 있습니다. 매우 큰 데이터 세트의 경우이 작업을 수행하지 않으려 고합니다. 실제로

select DimensionA, DimensionB, 
    json_extract_path_text(json_pivot, 'm1') m1, 
    json_extract_path_text(json_pivot, 'm2') m2 
from (
    select DimensionA, DimensionB, 
     '{' || listagg(quote_ident(MetricName) || ':' || quote_ident(MetricValue), ',') 
       within group (order by MetricName) || '}' as json_pivot 
    from to_pivot 
    group by DimensionA, DimensionB 
) 

당신이 그런 식으로 그것을 실행하고 싶지 않아요 :

는 여기 question linked above에 샘플 데이터를 기반으로 기본적인 생각이다. inner select는 "pivoted"테이블을 생성하는 데 사용하는 것이고 outer select는 특정 그룹 값을 참조하는 방법을 보여줍니다.

이 다음과 같은 같은 희미한 조합에 대한 중복 그룹 레코드에 대해 고려하지 않습니다

DimensionA DimensionB MetricName MetricValue 
---------- ---------- ---------- ----------- 
dimA1  dimB2  m1   v13 
dimA1  dimB2  m1   v23 

을 그는 데이터의 가능성 다음 그 처리 방법을 파악해야 할 것 인 경우. 나는 그것이 어떻게 구현 될지 확실하지 않다. 내 추측은 추출 될 첫 번째 사건입니다.

두 개의 사용자 지정 구분 기호를 사용하여 LISTAGGREGEXP_SUBSTR의 조합을 사용하여이 작업을 수행 할 수 있습니다.

JSON column typevarchar(max)을 사용하면 65535 바이트가 주어지며, 몇 천 개 카테고리에 대한 공간이어야합니다.

설명 slightly differently here.