sql - AWS Athena 根据列值创建行
问题描述
我有一个显示简单订单详细信息的表格,如下所示
+---------+---------+---------+
| 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 |
+---------+---------+---------+---------+
谁能帮助我如何编写查询来实现这一目标?
解决方案
我们可以在这里尝试使用递归 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)
也就是说,我们Line_id
从 4 开始计数,在递归的每一步中减一。在递归案例结束时,我们达到了Line_id
1 的值。
推荐阅读
- python - 每帧带有自定义叠加层的 FFMPEG H264
- awk - 从文件中删除与另一个文件的空白行相对应的行
- c++ - C++如何知道向量中的哪个元素
是派生的*? - azure-functions - 对相同的天蓝色时间触发功能使用不同的时间
- java - Maven:要获得最新版本 mvn clean 然后 mvn package 工作正常,但 mvn clean package 不能
- html - 如何使侧边栏默认折叠?
- java - 在 e4 中注入 eclipse 服务时的 NullPointer
- c++ - 如何将目标文件内容合并到存档中?
- c# - 为日期范围内的每个日期查询某些数据的最有效方法是什么
- php - Laravel 6 错误 429:X-Ratelimit-Remaining 扣除高于预期