StarRocks 使用窗口函数和聚合函数实现行转列

ChatGPT4o 使用 ChatGPT 4o 回答

问题:

StarRocks 行转列 原始数据,包含两列: A,B1 A,B2 A,B3

期望输出格式,包含4列: A,B1,B2,B3

回答:

在 StarRocks 中,你可以使用窗口函数和聚合函数来实现行转列的操作。假设你的原始数据表名为 original_table,包含两列 col1col2,你希望将相同 col1col2 值转为列。

以下是一个示例 SQL 查询,展示了如何实现这一点:

WITH ranked_data AS (
    SELECT
        col1,
        col2,
        ROW_NUMBER() OVER (PARTITION BY col1 ORDER BY col2) AS row_num
    FROM
        original_table
),
pivoted_data AS (
    SELECT
        col1,
        MAX(CASE WHEN row_num = 1 THEN col2 END) AS col2_1,
        MAX(CASE WHEN row_num = 2 THEN col2 END) AS col2_2,
        MAX(CASE WHEN row_num = 3 THEN col2 END) AS col2_3
    FROM
        ranked_data
    GROUP BY
        col1
)
SELECT
    col1,
    col2_1,
    col2_2,
    col2_3
FROM
    pivoted_data;

解释:

  1. ranked_data CTE(Common Table Expression)使用 ROW_NUMBER() 窗口函数为每个 col1 分组内的 col2 值分配一个行号。
  2. pivoted_data CTE 使用条件聚合(MAX(CASE WHEN ... THEN ... END))将行转为列。
  3. 最后一个 SELECT 语句从 pivoted_data 中选择所需的列。

请注意,这个示例假设每个 col1 组最多有 3 个 col2 值。如果有更多的值,你需要在 pivoted_data CTE 中添加更多的 MAX(CASE WHEN ...) 语句。

希望这能帮助你实现行转列的