我接到一个任务,其中的数据集在 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 去除 |
作为替换的一部分匹配的具体单元并不重要,我只需要能够提取客户在特定时间内的真实安装、替换和真实删除的数量。不过,每项活动只能与一项相反的活动配对!
谢谢!
创建两个临时表。
将所有安装放在一个表中,将所有删除放在另一个表中。
连接单位和客户的两个表,条件是移除日期 >= 安装日期且移除日期为 < 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 。
最后,您将在安装和删除表中填充有关它们是否属于另一个安装/删除的数据。
只需将它们结合起来,您就会拥有一张适合您需求的精美桌子。
如果您向我提供测试数据的插入语句,我会编写代码并将其发布在这里。然后您可以根据您的原始数据对其进行调整。