窗口函数 LEAD 不是下一个

问题描述 投票:0回答:1

我在 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

有什么想法吗?

如果不清楚,请告诉我,我可以提供更多解释。

sql databricks databricks-sql
1个回答
0
投票
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

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.