在登录或超出该日期范围的日期范围内获取活动类型

时间:2017-01-03 20:28:10

标签: sql sql-server

我有一个客户端类型历史记录表。这真的是将审计和客户数据拉在一起的观点,但让我们称之为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日等变化......

我觉得答案不应该是难以捉摸的,但我无法弄清楚。

1 个答案:

答案 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在日期范围内多次更改的情况的子句。