복붙노트

[SQL] 큐브, 롤업 및 GROUPBY 사업자의 차이점은 무엇입니까?

SQL

큐브, 롤업 및 GROUPBY 사업자의 차이점은 무엇입니까?

질문 제목에 꽤 많이 있습니다. 나는 차이에 관한 자세한 문서를 찾을 수 없습니다.

나는 큐브를 상호 교환하고 GROUPBY 함수 호출 할 때, 나는 다른 결과를 얻을 수 있기 때문에 차이를 느낄 않습니다. 나는 '큐브'를 사용하여 결과를 위해, 나는 종종별로 그룹화 표현식에 널 (null) 값을 많이 가지고 것으로 나타났습니다.

해결법

  1. ==============================

    1.이들은 같은 방식으로 작동되는 것은 아니다. GROUPBY 단순히 표준 SQL에서 GROUP BY 절의 것과 동일합니다. 다시 말해

    이들은 같은 방식으로 작동되는 것은 아니다. GROUPBY 단순히 표준 SQL에서 GROUP BY 절의 것과 동일합니다. 다시 말해

    table.groupBy($"foo", $"bar")
    

    상당이다 :

    SELECT foo, bar, [agg-expressions] FROM table GROUP BY foo, bar
    

    큐브는 GROUP BY에 CUBE 확장에 해당합니다. 그것은 열 목록을 소요하고 그룹화 열 모든 가능한 조합에 집계 식을 적용한다. 이 같은 데이터가 있다고 가정하자 :

    val df = Seq(("foo", 1L), ("foo", 2L), ("bar", 2L), ("bar", 2L)).toDF("x", "y")
    
    df.show
    
    // +---+---+
    // |  x|  y|
    // +---+---+
    // |foo|  1|
    // |foo|  2|
    // |bar|  2|
    // |bar|  2|
    // +---+---+
    

    당신 집계로 계산과 계산 큐브 (X, Y) :

    df.cube($"x", $"y").count.show
    
    // +----+----+-----+     
    // |   x|   y|count|
    // +----+----+-----+
    // |null|   1|    1|   <- count of records where y = 1
    // |null|   2|    3|   <- count of records where y = 2
    // | foo|null|    2|   <- count of records where x = foo
    // | bar|   2|    2|   <- count of records where x = bar AND y = 2
    // | foo|   1|    1|   <- count of records where x = foo AND y = 1
    // | foo|   2|    1|   <- count of records where x = foo AND y = 2
    // |null|null|    4|   <- total count of records
    // | bar|null|    2|   <- count of records where x = bar
    // +----+----+-----+
    

    큐브에 대한 유사한 기능은 왼쪽에서 오른쪽으로 계층 합계를 계산 롤업입니다 :

    df.rollup($"x", $"y").count.show
    // +----+----+-----+
    // |   x|   y|count|
    // +----+----+-----+
    // | foo|null|    2|   <- count where x is fixed to foo
    // | bar|   2|    2|   <- count where x is fixed to bar and y is fixed to  2
    // | foo|   1|    1|   ...
    // | foo|   2|    1|   ...
    // |null|null|    4|   <- count where no column is fixed
    // | bar|null|    2|   <- count where x is fixed to bar
    // +----+----+-----+
    

    그냥 비교를 위해 일반 GROUPBY의 결과를 볼 수 있습니다 :

    df.groupBy($"x", $"y").count.show
    
    // +---+---+-----+
    // |  x|  y|count|
    // +---+---+-----+
    // |foo|  1|    1|   <- this is identical to x = foo AND y = 1 in CUBE or ROLLUP
    // |foo|  2|    1|   <- this is identical to x = foo AND y = 2 in CUBE or ROLLUP
    // |bar|  2|    2|   <- this is identical to x = bar AND y = 2 in CUBE or ROLLUP
    // +---+---+-----+
    

    요약:

    ROLLUP 및 CUBE 당신이 당신은 또한 당신의 마음에 드는 RDMBS의 문서를 확인할 수 있습니다 작동하는 방법에 대한 이해를 얻으려면 데이터가 너무 확장을 창고에서 왔습니다. 예를 들어 PostgreSQL은 9.5에 모두 도입이 상대적으로 잘 설명되어 있습니다.

  2. ==============================

    2.당신에 의해 2.group 내가 추측 알고있다.

    당신에 의해 2.group 내가 추측 알고있다.

    3.rollup 및 큐브 SET 연산자를 그룹입니다. 롤업은 계층 적 방식으로 다차원 집계 및 치료 요소

    그리고 큐브에 계층 적으로 큐브를 요소를 치료하면 모든 차원에서 같은 일을하기보다는. 당신은 추상화의 수준을 이해하는 GROUPING_ID 시도 할 수 있습니다

  3. from https://stackoverflow.com/questions/37975227/what-is-the-difference-between-cube-rollup-and-groupby-operators by cc-by-sa and MIT license