【问题标题】:Count Number of Repeat Callers in a rolling 7 day peroid计算 7 天滚动期间的重复呼叫者数量
【发布时间】:2016-07-08 01:59:06
【问题描述】:

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

Repeat Flag公式基本上是统计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]

【问题讨论】:

  • 你几乎是对的。您需要为主查询分配一个别名,以确保 SQL Server 理解您的 [ID] = [ID] 的含义

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


【解决方案1】:

如果您为表设置别名,则您的查询将起作用,这样 SQL Server 引擎就不会出现歧义。注意:这是粗略的一瞥。

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

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

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

【讨论】:

  • 感谢 @cha 和 gregory 我调整了代码,现在可以使用了。 SELECT T.[CallID] ,T.[Date] ,T.[ID] ,T.[NoRepeat7days] ,T.[RepeatFlag] , (SELECT count(CALLID) as CountR FROM [CustomerData].[dbo].[RepeatCallers_testdata ] as F WHERE T.[ID] = F.[ID] AND ([Date] BETWEEN T.[Date]+1 AND T.[Date]+7)) as ft FROM [CustomerData].[dbo].[ RepeatCallers_testdata] 作为 T
【解决方案2】:

一种方法使用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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    • 2022-08-12
    相关资源
    最近更新 更多