2016-07-08 2 views
1

Fragen, ob Sie mir helfen können, eine Formel von Excel zu SQL Server 2008 zu replizieren. Wir versuchen, die Anzahl der Wiederholungsanrufe zu zählen, wenn ein Kunde anruft und testet wenn sie in 7 Tagen zurückrufen. Ich habe die Übung unten in Excel gemacht, aber ich finde es schwierig, die gleichen Ergebnisse in SQL zu produzieren.Anzahl der Wiederholungsanrufer in einem rollenden 7-Tage-Test

Die Formel "Wiederholungsmarkierung" zählt grundsätzlich die Anzahl der Datensätze nach dem Datum der ID und innerhalb von 7 Tagen. I.e 2222 am 24/03/2015 hat 4 Anrufe innerhalb von 7 Tagen.

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 

Hier ist mein SQL Versuch:

 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] 
+1

Sie sind fast richtig. Sie müssen einen Alias ​​für die Hauptabfrage zuweisen, um sicherzustellen, dass SQL Server versteht, was Sie mit Ihrem '[ID] = [ID]' gemeint sind. – cha

Antwort

2

Ihre Anfrage wird Alias ​​den Tabellen, wenn Sie arbeiten so nicht gibt es Mehrdeutigkeit für die SQL Server-Engine. HINWEIS: Dies war ein flüchtiger Blick.

Es sieht aus wie @Gordon Linoff bereits eine äußere Antwort auswerfen, so werde ich nicht auf diese Route gehen.

Sie haben einige andere Optionen, die Sie ausprobieren können. Eine besteht darin, Fensterfunktionen zu verwenden. Dies ist unglaublich schnell, da es nur einmal den Tisch scannt, um eine Antwort zu erhalten. Ich habe keinen Beispielcode für diese Richtung und habe keine Zeit, sie zu bearbeiten. Wenn Sie mit kleinen Sets arbeiten, ist das kein Problem, also würde ich nicht in diese Richtung gehen. Der Hauptgrund, Fensterfunktionen (Set-based Operations) zu verwenden, ist, wenn Sie mehr Leistung oder Skalierung benötigen.

Die CLR gibt Ihnen auch die Möglichkeit, mit .NET zu codieren. Wenn sich Ihr ursprünglicher Excel-Code in VB-Makros befindet, können Sie den Code migrieren und so optimieren, dass er VB.NET und nicht VB ist.

+0

Danke @cha und gregory Ich habe den Code optimiert und es funktioniert jetzt. SELECT T. [CallID] \t, T. [Datum] , T. [ID] , T. [NoRepeat7days] , T. [RepeatFlag] , (SELECT count (CALLID) als CountR FROM [Customer] . [dbo]. [RepeatCallers_testdata] als F WHERE T. [ID] = F. [ID] UND ([Datum] BETWEEN T. [Datum] +1 UND T. [Datum] +7)) als ft VON [CustomerData]. [Dbo]. [RepeatCallers_testdata] als T – Jimmyn

1

Ein Verfahren verwendet outer apply, so etwas wie folgt aussehen:

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;