用于在 8 周时间范围内查找抵消删除和安装的 SQL 代码

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

我接到一个任务,其中的数据集在 SQL Server 中如下所示(作为示例):

单位 客户 活动
2024-01-08 a 123 安装
2024-01-08 b 123 安装
2024-01-08 c 123 移除
2024-01-15 d 123 移除
2024-01-15 e 123 安装
2024-01-22 f 123 移除
2024-01-22 g 123 安装
2024-06-16 h 123 移除
2024-06-16 123 移除
2024-08-01 j 123 安装

目标是确定每次安装/删除是否是替换的一部分(这意味着每次删除都会被 8 周内的一次安装所抵消,反之亦然),或者是否是新安装(没有任何安装) 8 周内抵消移除且是真正的“增长”)或真正移除(8 周内没有抵消安装)。此示例数据集仅显示一个客户,但我有很多客户,并且 8 周内的“替换”将是在同一客户处安装和删除。

我很难在我的观点中写下如何让每个活动“找到”它的对立面来将自己定义为替换或确定它是新安装还是真正的删除,因为它在这 8 个活动中没有匹配项周跨度。有没有人做过类似的事情或者对我如何开始有任何想法?

我想要的输出是这样的(不包括解释栏,我只是将其包括在内以进行解释):

单位 客户 活动 类型 说明
2024-01-08 a 123 安装 更换安装 消除偏移
2024-01-08 b 123 安装 更换安装 消除偏移
2024-01-08 c 123 移除 更换拆卸 抵消安装
2024-01-15 d 123 移除 更换拆卸 安装时偏移
2024-01-15 e 123 安装 更换安装 去除偏移
2024-01-22 f 123 移除 更换拆卸 安装时偏移
2024-01-22 g 123 安装 真实安装 +- 8 周内没有抵消去除
2024-06-16 h 123 移除 更换拆卸 安装时的偏移量
2024-06-16 123 移除 真正去除 +- 8 周内无补偿安装
2024-08-01 j 123 安装 更换安装 偏移 h 去除

作为替换的一部分匹配的具体单元并不重要,我只需要能够提取客户在特定时间内的真实安装、替换和真实删除的数量。不过,每项活动只能与一项相反的活动配对!

谢谢!

sql sql-server sql-view
1个回答
0
投票

创建两个临时表。

将所有安装放在一个表中,将所有删除放在另一个表中。

连接单位和客户的两个表,条件是移除日期 >= 安装日期且移除日期为 < install date + 8 weeks.

From install as a outer join removal as b 
on a.unit = b.unit and a.customer = b.customer and b.date >= a.date and b.date < dateadd(ww, 8, a.date)

将结果存储在临时表中。让我们称之为#Installs_Mapped_To_Removal

在安装和删除时再次拆分此临时表。

如果安装在 8 周内被删除,则删除列将被填充。如果不是,它们就是 NULL。这样您就知道是否已完成更换。

对于删除,其工作原理相同。如果安装填满则有所属安装。如果为 NULl,则没有。

注意一次安装中是否存在两次或多次删除,或者一次删除中是否有两次或多次安装。如果您不关心这些实例,请使用不同的实例将其过滤掉,因为您将在新的安装和删除表中获得重复项。

如果您关心它们,您必须在表#Installs_Mapped_To_Removal 中进行分组,然后再进行拆分。这样您就可以根据需要进行计数或执行 String_Agg 。

最后,您将在安装和删除表中填充有关它们是否属于另一个安装/删除的数据。

只需将它们结合起来,您就会拥有一张适合您需求的精美桌子。

如果您向我提供测试数据的插入语句,我会编写代码并将其发布在这里。然后您可以根据您的原始数据对其进行调整。

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