【问题标题】:AWS Athena create rows based on a column valueAWS Athena 根据列值创建行
【发布时间】:2021-02-28 08:57:58
【问题描述】:

我有一张表格,显示简单的订单详细信息,如下所示

+---------+---------+---------+
| Order_id| Item_id |Quantity |
+---------+---------+---------+
| 10001   | 1       |   4     |
+---------+---------+---------+ 

现在我需要将每个数量显示为一个订单项,如下所示。

+---------+---------+---------+---------+
| Order_id| Item_id | Line_id |Quantity |
+---------+---------+---------+---------+
| 10001   | 1       | 1       |   1     |
+---------+---------+---------+---------+ 
| 10001   | 1       | 2       |   1     |
+---------+---------+---------+---------+ 
| 10001   | 1       | 3       |   1     |
+---------+---------+---------+---------+ 
| 10001   | 1       | 4       |   1     |
+---------+---------+---------+---------+ 

谁能帮助我如何编写查询来实现这一点?

【问题讨论】:

    标签: sql amazon-web-services presto amazon-athena


    【解决方案1】:

    我们可以在这里尝试使用递归 CTE:

    WITH cte AS (Order_id, Item_id, Line_id, Amount) AS (
        SELECT Order_id, Item_id, Quantity, 1
        FROM yourTable
        UNION ALL
        SELECT Order_id, Item_id, Line_id - 1, 1
        FROM cte
        WHERE Line_id - 1 >= 1
    )
    
    SELECT Order_id, Item_id, Line_id, Quantity
    FROM cte
    ORDER BY Order_id, Item_id, Line_id;
    

    上述 CTE 中的逻辑是,我们使用源表中的以下元组形成递归的基本情况:

    (10001, 1, 4, 1)
    

    也就是说,我们从 4 开始计数Line_id,在递归的每一步中减一。在递归案例结束时,我们将Line_id 的值设为 1。

    【讨论】:

    【解决方案2】:

    您可以在数组上使用unnest 来获取您想要的值:

    select od.order_id, od.item_id, u.line_number, u.quantity
    from order_details od cross join
         unnest(repeat(1, od.quantity)) with ordinality u(quantity, line_number)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-24
      • 2019-05-03
      • 2022-10-14
      • 2022-11-17
      • 1970-01-01
      • 2021-12-02
      • 2019-03-14
      • 2022-01-01
      相关资源
      最近更新 更多