【问题标题】:How to pivot in Snowflake?如何在 Snowflake 中旋转?
【发布时间】:2023-02-26 02:06:40
【问题描述】:

假设我有下表。如何旋转三列前缀为部分_每个customer_key 的前 3 个订单?

+--------------+----------+---------------+-------------+----------------+
| CUSTOMER_KEY | PART_KEY | PART_QUANTITY | PART_AMOUNT | TOP_ORDER_RANK |
+--------------+----------+---------------+-------------+----------------+
|        10003 |    98909 |            39 |   74,408.10 |              1 |
|        10003 |   157096 |            49 |   56,501.41 |              2 |
|        10003 |   179085 |            42 |   48,891.36 |              3 |
|        10003 |   179075 |            10 |   28,891.36 |              4 |
+--------------+----------+---------------+-------------+----------------+

预期结果:

+--------------+------------+-----------------+---------------+------------+-----------------+---------------+------------+-----------------+---------------+
| CUSTOMER_KEY | PART_1_KEY | PART_1_QUANTITY | PART_1_AMOUNT | PART_2_KEY | PART_2_QUANTITY | PART_2_AMOUNT | PART_3_KEY | PART_3_QUANTITY | PART_3_AMOUNT |
+--------------+------------+-----------------+---------------+------------+-----------------+---------------+------------+-----------------+---------------+
|        10003 |      98909 |              39 |     74,408.10 |     157096 |              49 |     56,501.41 |     179085 |              42 |     48,891.36 |
+--------------+------------+-----------------+---------------+------------+-----------------+---------------+------------+-----------------+---------------+

示例数据:

WITH t1 AS (
SELECT '10003' AS CUSTOMER_KEY, '98909' AS PART_KEY, 39 AS PART_QUANTITY, 74408.10 AMOUNT, 1 TOP_ORDER_RANK UNION ALL
SELECT '10003' AS CUSTOMER_KEY, '157096' AS PART_KEY, 49 AS PART_QUANTITY, 56501.41 AMOUNT, 2 TOP_ORDER_RANK UNION ALL
SELECT '10003' AS CUSTOMER_KEY, '179085' AS PART_KEY, 42 AS PART_QUANTITY, 48891.36 AMOUNT, 3 TOP_ORDER_RANK UNION ALL
SELECT '10003' AS CUSTOMER_KEY, '179075' AS PART_KEY, 10 AS PART_QUANTITY, 28891.36 AMOUNT, 4 TOP_ORDER_RANK
    )

【问题讨论】:

  • 没有聚合是什么意思,你想要一行 4 行中的 3 行,所以你必须至少使用一个 GROUP BY 或数据透视表,甚至这有一个聚合 docs.snowflake.com/en/sql-reference/constructs/pivot
  • 如果在旋转时确实没有任何重叠记录,那么我建议使用 ANY_VALUE() 函数。这按结果选择组中的任何值,并且由于在您的情况下只有 1 个值,因此它比使用 MIN() 或 MAX() 函数执行得更快。但是,正如上面的评论所指出的,您必须使用某种聚合函数。
  • 更新了标题。我不确定枢轴函数能否给出预期的结果。如果您有解决方案,请告诉我。 @nbk

标签: sql pivot snowflake-cloud-data-platform aggregate-functions


【解决方案1】:

您可以使用条件聚合进行透视。这是不依赖供应商特定实现的标准 SQL,例如 Snowflake 的 pivot

select CUSTOMER_KEY,
    max(case when TOP_ORDER_RANK = 1 then PART_KEY      end) PART_KEY_1,
    max(case when TOP_ORDER_RANK = 1 then PART_QUANTITY end) PART_QUANTITY_1,
    max(case when TOP_ORDER_RANK = 1 then PART_AMOUNT   end) PART_AMOUNT_1,
    max(case when TOP_ORDER_RANK = 2 then PART_KEY      end) PART_KEY_2,
    max(case when TOP_ORDER_RANK = 2 then PART_QUANTITY end) PART_QUANTITY_2,
    max(case when TOP_ORDER_RANK = 2 then PART_AMOUNT   end) PART_AMOUNT_2,
    max(case when TOP_ORDER_RANK = 3 then PART_KEY      end) PART_KEY_3,
    max(case when TOP_ORDER_RANK = 3 then PART_QUANTITY end) PART_QUANTITY_3,
    max(case when TOP_ORDER_RANK = 3 then PART_AMOUNT   end) PART_AMOUNT_3
from t1
group by CUSTOMER_KEY

【讨论】:

    猜你喜欢
    • 2021-09-18
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 2023-03-20
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多