【发布时间】:2020-03-26 17:36:21
【问题描述】:
我有这样一个问题:我需要计算客户动态更改日期范围的状态。
我有两种类型的客户:活跃的、不活跃的和丢失的。 活跃 - 3 年,不活跃 = 活跃 + 1 年,丢失 = 不活跃 + 1 年。例如,客户在 2018 年 3 月 3 日购买了产品。他活跃:03-03-2018:03-03-2021,不活跃:04-03-2021:03-03-2022,丢失 - 04-03-2022 当我输入 Period Start 和 Period End Date 时,我需要获取客户的当前状态。我想动态地创建历史性。
DECLARE @StartPeriod DATE = '2019-01-01';
DECLARE @EndPeriod DATE = '2019-11-23';
SELECT @EndPeriod AS EndPeriod
,StartDate
,EndDate
,CustomerId
,ProductId
,CustomerType = CASE
WHEN EndDate >= @EndPeriod THEN 'Active'
WHEN EndDate >= DATEADD(MONTH, -12, @EndPeriod) AND EndDate < @EndPeriod
THEN 'Inactive'
WHEN EndDate < EndPeriod THEN 'Lost'
ELSE 'unknown' END
FROM Table
WHERE EndDate between @StartPeriod and @EndPeriod
条件WHERE EndDate between @StartPeriod and @EndPeriod 很糟糕,因为我没有得到所有数据。例如,客户是 Active-2016-11-24: 2019:11-24。使用我上面的范围,我没有得到这个客户,但他在那个时期很活跃。
怎么实现?
当我选择这样的范围时:
DECLARE @StartPeriod DATE = '2019-01-01';
DECLARE @EndPeriod DATE = '2019-11-24';
我得到这样的结果(而且是正确的):
当我选择这样的范围时:
DECLARE @StartPeriod DATE = '2019-01-01';
DECLARE @EndPeriod DATE = '2019-11-23';
我得到一个空的结果。但是客户是活跃的(这是因为Where 条件错误)。
不同的客户有不同的End Date。但我需要知道每个选定时期的状态。我不知道如何实施这种情况。
【问题讨论】:
-
请以表格文本的形式提供示例数据和预期结果。
-
每个人都有结束日期吗?您可能需要在该范围内指定结束日期,或者不存在结束日期。
-
您需要提供数据样本
-
我在上面的主题中提供了一个例子
标签: sql-server tsql