将开始日期和结束日期转换为规范化表

时间:2017-05-11 14:34:22

标签: sql sql-server date sql-server-2012

我有一张包含客户记录的表格,每个客户都有一个开始日期和结束日期。我正在寻找最有效的方法将其转换为一个表,计算每天活跃客户的数量。 例如

现有表格(表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表,然后按引用日期列进行分组。虽然这种方法有效,但客户表非常大,我希望能够应用其他条件(即客户的地理位置,产品等),这将进一步影响性能。

感谢帮助!

1 个答案:

答案 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 |
+------------+----------------+