2016-05-31 5 views
2

데이터를 집계하고 결과를 여러 필드로 그룹화하고 모두 관련 "소계"순열을 추출하는 쿼리를 실행하려고합니다. (MSSQL의 CUBE()와 유사)여러 부분합 - 필드의 롤업 순서

Group By Rollup()을 사용하는 경우 Rollup 함수의 Group By 필드의 순서에 따라 순열을 얻습니다. 예를 들어 아래의 쿼리 (공용 데이터 세트에서 실행)는 연도별로 또는 연도와 월별 또는 연도, 월 및 메달리온을 반환하지만 메달리그램은 부분합을 반환하지 않습니다.

SELECT 
    trip_year, 
    trip_month, 
    medallion, 
    SUM(trip_count) AS Sum_trip_count 
FROM 
    [nyc-tlc:yellow.Trips_ByMonth_ByMedallion] 
WHERE 
    medallion IN ("2R76", "8J82", "3B85", "4L79", "5D59", "6H75", "7P60", "8V48", "1H12", "2C69", "2F38", "5Y86", "5j90", "8A75", "8V41", "9J24", "9J55", "1E13", "1J82") 
GROUP BY 
    ROLLUP(trip_year, 
    trip_month, 
    medallion) 

내 질문은 : 나는 하나의 쿼리 결과에서 "하위 합계"의 모든 다른 순열을 얻기 위해 무엇을해야 .

이미 시도 : 유사한 쿼리이지만 순서가 다른 조합은 작동하지만 우아하지는 않습니다 (너무 많은 공용체가 필요할 것입니다). 감사합니다.

답변

1

두 번 모두 맞습니다. BigQuery에서 ROLLUP은 나열된 필드를 엄격하게 정렬 된 목록으로 취급하는 계층 구조를 존중합니다. 그들의 명령은 집계 중에 변경되지 않습니다.

다른 SQL 환경에서 흔히 발견되는 CUBE 집계는 정렬되지 않고 실제로 나열된 필드의 가능한 모든 순서/하위 집합을 집계합니다. 현재 CUBE은 BigQuery에 구현되지 않았습니다. 당신이 제안하는 해결 방법은 또한 내가 제안하는 것입니다. UNION 모든 결과 집합은 포함 된 필드의 각 순열을 사용하여 ROLLUP에서 설정합니다. 이상적이지는 않지만 동일한 결과를 얻어야합니다.

은 즉, ROLLUP 필드의 다른 순열 여러 쿼리의 UNION의 순간에 이것을 달성하기 위해 유일한 방법입니다. 단점은 유지 관리가 어려울 수도 있고 쿼리에서 더 비쌀 수도 있다는 것입니다.

CUBE을 BigQuery에 구현하려면 Big Query public issue tracker에 기능 요청을 제출하는 것이 좋습니다. 이 요청에 철저한 유스 케이스를 포함시켜야합니다.

UPDATE는 : 제발 스타을, 영업 이익 제출 한 feature request 지원하기 위해 당신은 업데이트 알림을받을 수 있습니다.

+0

이 질문에 적절하게 대처할 수 있습니까? – Nicholas

+1

대답은 분명하지만 내 문제는 해결되지 않습니다. 유니온 모두 옵션이 아닙니다. 그것은 n이 필요합니다! 같은 쿼리의 repitions. 그룹화 필드가 9 개이면 기본 설정이 불가능 해집니다. –

+0

나는 이것이 비효율적이고 유지하기가 어렵고 비용이 많이 드는 것에 동의합니다. 그러나 제안한 해결 방법은 현재 단일 쿼리에서 찾는 집계를 가져 오는 ** 유일한 방법입니다. 따라서 기능 요청을 제출하는 것이 좋습니다. 더 명확하게 반영하도록 답변을 업데이트했습니다. – Nicholas