计算滚动7天内的重复呼叫者数量

时间:2016-07-08 01:59:07

标签: sql sql-server sql-server-2008

想知道您是否可以帮我复制从excel到SQL Server 2008的公式。我们要做的是计算客户来电时的重复呼叫次数,并测试他们是否在7天内回电。我在excel中完成了下面的练习,但是我发现很难在SQL中生成相同的结果。

重复标记公式基本上计算ID日期之后和7天内的记录数。 2015年3月24日的2222在7天内有4个电话。

Repeat Flag formula =COUNTIFS(B:B,B2,A:A,">" &A2,A:A,"<"&A2+8)

Date    ID  Repeat Flag
23/03/2015  1111    0
24/03/2015  2222    4
25/03/2015  2222    3
26/03/2015  2222    2
27/03/2015  3333    5
28/03/2015  2222    1
29/03/2015  2222    0
30/03/2015  3333    7
31/03/2015  3333    7
1/04/2015   3333    7
2/04/2015   3333    7
3/04/2015   3333    7
4/04/2015   3333    7
5/04/2015   3333    6
6/04/2015   3333    5
7/04/2015   3333    4
8/04/2015   3333    3
9/04/2015   3333    2
10/04/2015  3333    1
11/04/2015  3333    0

这是我的SQL尝试:

     SELECT [CallID]
      ,[Date]
      ,[ID]
      ,[NoRepeat7days]
      ,[RepeatFlag]
      , (SELECT count(CALLID) as CountR
FROM [CustomerData].[dbo].[RepeatCallers_testdata]
WHERE  [ID] = [ID] AND
     ([Date] BETWEEN [Date] AND [Date]+7)) as ft


  FROM [CustomerData].[dbo].[RepeatCallers_testdata]

2 个答案:

答案 0 :(得分:2)

如果对表进行别名,则查询将起作用,因此SQL Server引擎没有歧义。注意:这是粗略的一瞥。

看起来@Gordon Linoff已经抛弃了一个外部应用答案,所以我不会走这条路。

您可以尝试其他一些选项。一种是使用Window函数。这非常快,因为它只扫描一次表格以获得答案。我没有这个方向的示例代码,也没有时间来完成它。如果你正在处理足够小的集合,这不是问题,所以我不会去这个方向。前往窗口函数(基于集合的操作)的主要原因是当您需要更高的性能或规模时。

CLR还为您提供了使用.NET进行编码的选项。如果您的原始Excel代码是在VB宏中,您将能够迁移代码并进行调整,因此它是VB.NET而不是VB。

答案 1 :(得分:1)

一种方法使用outer apply,看起来像这样:

select td.*, td2.flag
from [CustomerData].[dbo].[RepeatCallers_testdata] td OUTER APPLY
     (select count(*) as flag
      from [CustomerData].[dbo].[RepeatCallers_testdata] td2
      where td2.id = td.id and
            td.[date] between dateadd(day, 1, td2.[date]) and dateadd(day, 7, td2.[date])
     ) td2;