一尘不染

需要删除标志值之前存在的行

sql

我正在寻找删除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)

阅读 92

收藏
2022-07-22

共1个答案

一尘不染

使用条件 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
2022-07-22