Bonjour,

J'ai une requête qui calcule le nombre d'actions d'un usager par mois de façon *relative*, c'est à dire que le premier mois comptabilisé d'un usager pourrait être janvier 2012 alors que pour un autre ça serait mars 2013. Je veux comparer les niveaux d'activités dans les premiers mois et derniers mois d'une souscription.

J'ai déjà une requête qui fonctionne mais je me demande s'il ne serait pas possible de l'améliorer. Je suis de la vieille école (SQL 7 en 1998) et je n'ai jamais vraiment intégré les requêtes récursives.

Voici un exemple que vous pouvez tester par vous-mêmes.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
DECLARE @Subscriptions TABLE (ID Int, DateActivity Date, Actions Int)
 
INSERT INTO @Subscriptions SELECT 1, '2010-01-01', 10
INSERT INTO @Subscriptions SELECT 1, '2010-01-02', 10
INSERT INTO @Subscriptions SELECT 1, '2010-02-01', 10
INSERT INTO @Subscriptions SELECT 2, '2010-01-01', 10
INSERT INTO @Subscriptions SELECT 2, '2010-01-02', 10
INSERT INTO @Subscriptions SELECT 2, '2010-02-01', 10
INSERT INTO @Subscriptions SELECT 2, '2010-02-01', 10
INSERT INTO @Subscriptions SELECT 3, '2010-03-01', 10
INSERT INTO @Subscriptions SELECT 3, '2010-04-01', 10
INSERT INTO @Subscriptions SELECT 3, '2010-04-01', 10
INSERT INTO @Subscriptions SELECT 3, '2010-04-01', 10
INSERT INTO @Subscriptions SELECT 3, '2010-04-01', 10
 
SELECT S.ID, DATEDIFF(month, MinActivity, DateActivity) + 1 As MonthNo, SUM(Actions) As QtyActions
FROM @Subscriptions S
JOIN
(
	SELECT ID, MIN(DateActivity) As MinActivity
	FROM @Subscriptions
	GROUP BY ID
) Ranges ON S.ID = Ranges.ID
GROUP BY S.ID, DATEDIFF(month, MinActivity, DateActivity) + 1
ORDER BY 1, 2
Voici les résultats attendus:

1 1 20
1 2 10
2 1 20
2 2 20
3 1 10
3 2 40
Donc: Est-il possible d'améliorer la lisibilité et/ou la performance de cette requête?

Merci