我有一个客户端类型历史记录表。这真的是将审计和客户数据拉在一起的观点,但让我们称之为tTypeHistory。它也不会按客户端ID分组,但我试图让它易于阅读。
以下是一些示例数据:
iClientID | IClientType | dEffectiveDate
1 | 6 | 8/1/2016
1 | 7 | 8/30/2016
1 | 8 | 9/30/2016
2 | 6 | 8/15/2016
2 | 7 | 9/5/2016
2 | 8 | 10/2/2016
3 | 6 | 9/15/2016
3 | 8 | 10/12/2016
我可以很容易地找出特定日期的客户类型:
SELECT TOP 1 iClientType
FROM tTypeHistory
WHERE iClientID = 1 dEffectiveDate <= '9/1/2016'
我可以很容易地找到任何曾经是7型客户端的人,但是我想要做的就是找出一个范围内的类型7,通常是一个月,但可以是任何特定的范围。
我可以搜索类型7的9 / 1-9 / 30之间的有效日期,我找到客户端ID 2,但是找不到客户端1.从8/30开始它们是7型,直到他们改为在9月30日键入8,但它可能在10月30日等变化......
我觉得答案不应该是难以捉摸的,但我无法弄清楚。
答案 0 :(得分:1)
不幸的是,它并不像看起来那么直截了当。主要原因是每行只有生效日期并且缺少结束日期。下面的查询计算出结束日期,然后选择所需的iClientID&#39;:
with cte
AS
(
select *,
(select top 1 dEffectiveDate
from @TypeHistory t
where t.iClientID = t1.iClientID and t.dEffectiveDate > t1.dEffectiveDate
order by t.dEffectiveDate) as dEndDate
from @TypeHistory t1
)
select distinct iClientID
from cte
where iClientType = 7
and ( dEffectiveDate between '9/1/2016' and '9/30/2016'
or dEndDate between '9/1/2016' and '9/30/2016'
or (dEndDate is null and dEffectiveDate < '9/1/2016'));
编辑:更改了&#39;其中&#39;用于解决iClientType在日期范围内多次更改的情况的子句。