【问题标题】:Expand rows to columns in presto在 presto 中将行扩展到列
【发布时间】:2018-12-01 02:15:33
【问题描述】:

有什么方法可以有效地将行扩展到列?

我尝试分别用'where team = 1'和'where team = 2'过滤原始数据集,先对应得到dataset1和dataset 2,然后在income_level上加入这两个数据集。但是,当income_level 具有太多不同的值时,会很不方便。有什么有效的方法可以得到我想要的结果吗?

【问题讨论】:

    标签: presto


    【解决方案1】:

    Prestodb 提供了一个map_agg 函数,可以帮助将您的长数据转换为您正在寻找的宽格式。不幸的是,似乎没有一种方法可以动态创建列名,但这种方法应该比加入每个团队更有效(并且输入更少:))。

    WITH raw_data AS (
      SELECT 1 AS team, 'a' AS income_level, 1 AS time, 11 AS ord
      UNION
      SELECT 1 AS team, 'b' AS income_level, 2 AS time, 12 AS ord
      UNION
      SELECT 1 AS team, 'c' AS income_level, 3 AS time, 13 AS ord
      UNION
      SELECT 2 AS team, 'a' AS income_level, 4 AS time, 14 AS ord
      UNION
      SELECT 2 AS team, 'b' AS income_level, 5 AS time, 15 AS ord
      UNION
      SELECT 2 AS team, 'c' AS income_level, 6 AS time, 16 AS ord
      UNION
      SELECT 3 AS team, 'a' AS income_level, 7 AS time, 17 AS ord
      UNION
      SELECT 3 AS team, 'b' AS income_level, 8 AS time, 18 AS ord
      UNION
      SELECT 3 AS team, 'c' AS income_level, 9 AS time, 19 AS ord
    )
    
    SELECT
      income_level,
      team_time[1] AS time_1,
      team_ord[1] AS ord_1,
      team_time[2] AS time_2,
      team_ord[2] AS ord_2,
      team_time[3] AS time_3,
      team_ord[3] AS ord_3
    FROM (
      SELECT
        income_level,
        map_agg(team, time) AS team_time,
        map_agg(team, ord) AS team_ord
      FROM raw_data
      GROUP BY income_level
    );
    

    输出:

    | income_level | time_1 | ord_1 | time_2 | ord_2 | time_3 | ord_3 |
    |--------------|--------|-------|--------|-------|--------|-------|
    | a            | 1      | 11    | 4      | 14    | 7      | 17    |
    | b            | 2      | 12    | 5      | 15    | 8      | 18    |
    | c            | 3      | 13    | 6      | 16    | 9      | 19    |
    

    This site 提供了另一个如何做到这一点的示例。

    【讨论】:

    • 它有效。非常感谢。事实上,我上面发布的原始数据集是一个简单的版本。在完整的数据集中,income_level 代表所有团队,但是,有 8 个团队的值为 [0,1,2,10,11,12,21,22]。我想出的解决方案是用where team = 0 创建第一个表,然后在income_level 上加入用where team = 1 创建的第二个表。重复这些步骤直到team = 22。而且这种方式似乎效率较低。
    • @GuoyingZheng 感谢您的澄清。我更新了我的解决方案以利用 map_agg 函数,当有两个以上的团队时,它可以更好地旋转数据。
    猜你喜欢
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    相关资源
    最近更新 更多