2010-12-01 47 views
2

Je suis en train de produire une requête sur le tableau ci-dessous (partie pertinente uniquement):Comment calculer la fréquence d'occurrence de la date moyenne dans SQL

Create Table [Order] (
    OrderID int NOT NULL IDENTITY(1,1), 
    CreationDate datetime NOT NULL, 
    CustomerID int NOT NULL 
) 

Je voudrais voir une liste des CustomerIDs à ​​la moyenne de chaque client nombre de jours entre les commandes. Je suis curieux de savoir si cela peut être fait avec une solution basée sur un ensemble pur ou si une solution curseur/table temporaire est nécessaire.

+0

SQL Server Dommage ne prend pas en charge LEAD ou LAG ...:/ –

+1

Si un client fait 4 commandes le 1er jour, puis un plus 5 jours plus tard, ce qui est la moyenne? Est-ce '(0 + 0 + 0 + 5)/4 = 1.25'? –

+0

Si nous permettons des différences de date fractionnées, je pense que nous irons bien puisque, de façon réaliste, il y aura toujours une différence de temps (minutes) entre les commandes des clients. –

Répondre

3
;WITH base AS 
    ( 
    SELECT CustomerID, 
      ROW_NUMBER() over (partition BY CustomerID ORDER BY CreationDate, OrderID) AS rn 
    FROM  [Order] 
    ) 
SELECT b1.CustomerID, 
     AVG(DATEDIFF(DAY,b1.CreationDate, b2.CreationDate)) 
FROM  base b1 
     JOIN base b2 
     ON  b1.CustomerID=b2.CustomerID 
     AND  b2.rn  =b1.rn+1 
GROUP BY b1.CustomerID