我在 DATABRICKS 中有一个库存移动情况,其中一行用于生产输入,另一行用于产品取消。
运动 | 产品 | 运动类型 | DATE_TIME | 数量 |
---|---|---|---|---|
1 | 1 | 输入 | 2024-05-01 12:00 | 10 |
2 | 1 | 取消 | 2024-05-01 12:10 | 10 |
3 | 1 | 输入 | 2024-05-01 13:00 | 30 |
4 | 1 | 输入 | 2024-05-01 13:10 | 30 |
5 | 1 | 取消 | 2024-05-01 13:40 | 30 |
6 | 1 | 取消 | 2024-05-01 13:50 | 40 |
我需要将 CANCEL_MOVMENT_ID 关联到 ENTER,这样我就可以将其识别为已取消。
了解相应取消的唯一方法是在 DATE_TIME 之前。我正在尝试使用窗口引导功能,问题是有时我可以在两个 ENTER 之后有 2 个(或更多)取消(例如 ID 从 3 到 6)。在这种情况下,我需要将第一个 ENTER 与第一个取消关联起来,依此类推(3-5 和 4-6)。
结果应该是下面的例子。
运动 | 产品 | 运动类型 | DATE_TIME | 数量 | 取消_移动 |
---|---|---|---|---|---|
1 | 1 | 输入 | 2024-05-01 12:00 | 10 | 2 |
2 | 1 | 取消 | 2024-05-01 12:10 | 10 | |
3 | 1 | 输入 | 2024-05-01 13:00 | 30 | 5 |
4 | 1 | 输入 | 2024-05-01 13:10 | 30 | 6 |
5 | 1 | 取消 | 2024-05-01 13:40 | 30 | |
6 | 1 | 取消 | 2024-05-01 13:50 | 40 |
我尝试使用的查询是这个,但它总是获取上一行。
SELECT a.*,
LEAD(a.MOVEMENT) OVER (PARTITION BY a.PRODUCT ORDER BY a.DATE_TIME) AS CANCEL_MOVEMENT
FROM table_movement a
有什么想法吗?
如果不清楚,请告诉我,我可以提供更多解释。
WITH CTE as
(
SELECT a.*,
ROW_NUMBER() OVER(PARTITION BY MOVEMENT_TYPE ORDER BY Movement ASC) as rn
FROM table_movement a
)
SELECT t.*,
cancel.Movement as CANCEL_MOVEMENT
FROM CTE t
LEFT JOIN CTE cancel ON cancel.rn=t.rn and t.MOVEMENT_TYPE='ENTER' and cancel.MOVEMENT_TYPE='CANCEL'
ORDER BY t.Movement