我有一张包含客户记录的表格,每个客户都有一个开始日期和结束日期。我正在寻找最有效的方法将其转换为一个表,计算每天活跃客户的数量。 例如:
现有表格(表A):
Customer - Start Date - End Date
A - 1/1/2017 - 1/3/2017
B - 1/2/2017 - 1/5/2017
我需要什么(表B):
Date - Customer_Count
1/1/2017 - 1
1/2/2017 - 2
1/3/2017 - 2
1/4/2017 - 1
1/5/2017 - 1
我现在使用的方法只是将日期引用表连接到customer表,然后按引用日期列进行分组。虽然这种方法有效,但客户表非常大,我希望能够应用其他条件(即客户的地理位置,产品等),这将进一步影响性能。
感谢帮助!
答案 0 :(得分:1)
您可以使用自定义表生成日期,并执行交叉应用,如下所示:
select RowN as [Date], count(*) as Customer_Count from #yourcust cross apply
(
select top (datediff(day, startdate, enddate)+1) rowN = dateadd(day, row_number() over (order by s1.name) -1 , startdate) from master..spt_values s1,master..spt_values s2
) a
group by RowN
输出
+------------+----------------+
| Date | Customer_Count |
+------------+----------------+
| 2017-01-01 | 1 |
| 2017-01-02 | 2 |
| 2017-01-03 | 2 |
| 2017-01-04 | 1 |
| 2017-01-05 | 1 |
+------------+----------------+