T-SQL - 跟踪一段时间内的事件

tri*_*nes 3 sql t-sql date dimensional-modeling

我有一些与之相关的数据ValidFromValidTo日期.简单来说:

MembershipId | ValidFromDate | ValidToDate
==========================================
0001         | 1997-01-01    | 2006-05-09
0002         | 1997-01-01    | 2017-05-12
0003         | 2005-06-02    | 2009-02-07
Run Code Online (Sandbox Code Playgroud)

此表上有一个非聚集索引,其中包含两个日期作为键值.

我也有涵盖了所有日期从时间维度表19002999.

我试图找出我怎么能选择一个范围从日期维度表的日期(假设2016-01-012016-12-31),然后确定对于每一日期,许多成员是如何在该日起生效.

下面的代码完成了工作,但性能不是很好,我想知道是否有人有任何建议可以更好地解决这个问题?

SELECT 
   d.DateKey
  ,(SELECT COUNT(*) FROM Memberships AS m
    WHERE d.DateKey between m.ValidFromDateKey and m.ValidToDateKey
    ) AS MembershipCount

FROM       
   DIM.[Date] AS d

WHERE
   d.CalendarYear = 2016
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的任何建议!

iam*_*ave 5

你的SQL中的逻辑大多是正确的,你刚刚为SQL的喜欢做的事情做得不好.从Dates您已经完成的表开始,而不是对每行数据进行子选择,将您的逻辑更改为a join并且您在那里:

select d.DateKey
      ,count(m.MembershipID) as MembershipCount
from DIM.[Date] as d
    left join Memberships as m
        on(d.DateKey between m.ValidFromDateKey and m.ValidToDateKey)
where d.CalendarYear = 2016
group by d.DateKey
order by d.DateKey;
Run Code Online (Sandbox Code Playgroud)

您可能需要注意的是确定每天要计算的会员资格.例如,如果您的日期是当2006-05-09会员ID 0001在当天结束时被包括在内吗?

问题基本上是,您是计算在一整天中任何时间点活跃的会员数量,还是仅计算在特定时间(例如一天的开始或结束时)活跃的会员数量?

然后为您的ValidFromDate值重复此思考过程.