SQL의 종횡 변환 요약(pivot 및 unpivot)

11107 단어 PrestohiveSQL
다음 그림에서 보듯이 [종단] 테이블을 [종단] 으로 변환하는 것을 [경첩] 이라고 하고, 반대로 [종단] 테이블을 [종단] 으로 변환하는 것을'비경첩'이라고 합니다.이러한 전환을 진행하는 방법을 총결하였다.
  • 표준 SQL
  • Presto
  • Hive
  • Pandas (Python)


  • 표준 SQL


    SQL-like 쿼리 언어 어디에서나 사용할 수 있는 쓰기 방법입니다.
    Pivot
    SELECT uid,
           max(CASE WHEN key = 'c1' THEN value END) AS c1,
           max(CASE WHEN key = 'c2' THEN value END) AS c2,
           max(CASE WHEN key = 'c3' THEN value END) AS c3
    FROM vtable
    GROUP BY uid
    ;
    
    uid  c1  c2  c3
    ---  --  --  --
    101  11  12  13
    102  21  22  23
    
    Unpivot
    SELECT uid, 'c1' AS key, c1 AS value FROM htable
    UNION ALL
    SELECT uid, 'c2' AS key, c2 AS value FROM htable
    UNION ALL
    SELECT uid, 'c3' AS key, c3 AS value FROM htable
    ;
    
    uid  key  value
    ---  ---  -----
    101   c1     11
    102   c1     21
    101   c2     12
    102   c2     22
    101   c3     13
    102   c3     23
    

    Presto


    표준 SQL 방법도 가능하지만 다음과 같은 방법을 사용할 수도 있습니다.
    Pivotmap_agg 함수로 지도형 구조를 만든 후 참조하는 방법.
    SELECT
      uid,
      kv['c1'] AS c1,
      kv['c2'] AS c2,
      kv['c3'] AS c3
    FROM (
      SELECT uid, map_agg(key, value) kv
      FROM vtable
      GROUP BY uid
    ) t
    
    uid  c1  c2  c3
    ---  --  --  --
    101  11  12  13
    102  21  22  23
    
    Unpivot
    열을 만들어 배열한 후CROSS JOIN unnest 펼치는 방법이다.PostgreSQL에서도 사용할 수 있습니다.
    SELECT t1.uid, t2.key, t2.value
    FROM htable t1
    CROSS JOIN unnest (
      array['c1', 'c2', 'c3'],
      array[c1, c2, c3]
    ) t2 (key, value)
    
    uid  key  value
    ---  ---  -----
    101   c1     11
    101   c2     12
    101   c3     13
    102   c1     21
    102   c2     22
    102   c3     23
    

    Hive


    Pivot
    표준 Hive 함수는 아니지만 Treasure 데이터의 Hive에 to_map UDAF를 추가하여 지도형 구조를 만든 후에 참조할 수 있습니다.
    SELECT
      uid,
      kv['c1'] AS c1,
      kv['c2'] AS c2,
      kv['c3'] AS c3
    FROM (
      SELECT uid, to_map(key, value) kv
      FROM vtable
      GROUP BY uid
    ) t
    
    uid  c1  c2  c3
    ---  --  --  --
    101  11  12  13
    102  21  22  23
    
    UnpivotLATERAL VIEW explode 전개 방법이 있다.
    SELECT t1.uid, t2.key, t2.value
    FROM htable t1
    LATERAL VIEW explode (map(
      'c1', c1,
      'c2', c2,
      'c3', c3
    )) t2 as key, value
    
    uid  key  value
    ---  ---  -----
    101   c1     11
    101   c2     12
    101   c3     13
    102   c1     21
    102   c2     22
    102   c3     23
    

    Pandas

    pivotmelt 등의 함수를 사용할 수 있습니다.
    Pivot
    In [1]: vtable.pivot('uid', 'key', 'value')
    Out[1]:
    key  c1  c2  c3
    uid
    101  11  12  13
    102  21  22  23
    
    Unpivot
    In [2]: pd.melt(htable, 'uid', var_name='key')
    Out[2]: 
      uid  key  value
    0 101   c1     11
    1 101   c2     12
    2 101   c3     13
    3 102   c1     21
    4 102   c2     22
    5 102   c3     23
    

    좋은 웹페이지 즐겨찾기