我正在寻找删除FirstOrder标志之前存在的行(以黄色突出显示)(由 分区CustomerID)。
FirstOrder
CustomerID
业务案例是我需要删除在其首次订购日期之前有一行的每个客户的行(ASOFDATE,其中 FirstOrder=1)。
我尝试创建另一个列,将每个客户的最短日期和每个 FirstOrder 的最短日期合并,以创建一种范围,但我遇到困难的是如何计算这些日期之间的 NULL。我的一个想法是让日期之间的日期与第一个日期相同,然后我可以简单地删除这个提议的“参考日期”<(asofdate where firstorder = 1)的行,但我没有运气得到那个去工作:
我确定解决方案非常简单,我只是没有看到它。这是示例数据:
CREATE TABLE #DATA (ASOFDATE DATE, CUSTOMERID INT, ACTIVE BIT, FIRSTORDER BIT) INSERT INTO #DATA VALUES ('2018-01-31', 206424, NULL, NULL), ('2018-02-28', 206424, NULL, NULL), ('2018-03-31', 206424, 1, 1), ('2022-06-30', 206424, NULL, NULL), ('2022-07-31', 206424, NULL, NULL), ('2018-06-30', 247034, NULL, NULL), ('2018-07-31', 247034, NULL, NULL), ('2018-08-31', 247034, 1, 1), ('2022-05-31', 247034, NULL, NULL)
使用条件 sum() over() 可能会有所帮助
例子
;with cte as ( Select * ,Flag = sum( case when FirstOrder=1 then 1 else 0 end ) over (partition by CustomerID order by asofdate) from #Data ) Delete from cte where Flag=0
更新表
ASOFDATE CUSTOMERID ACTIVE FIRSTORDER 2018-03-31 206424 1 1 2022-06-30 206424 NULL NULL 2022-07-31 206424 NULL NULL 2018-08-31 247034 1 1 2022-05-31 247034 NULL NULL