Fonction - Moyenne mobile - test avec cible variable
Bonjour à tous,
Je souhaiterais avoir vos avis sur la manière de résoudre le problème suivant :
Dans le cadre d'une évaluation statistique, j'ai une table reprenant des essais réalisés sur plusieurs produits.
Dès que j'ai 3 essais sur un produit, je calcule la moyenne des 3, et cette valeur sert de référence à un test. Cette moyenne est mobile, chaque fois qu'un nouvel essai est disponible, une nouvelle moyenne des 3 derniers essais est calculée.
La valeur obtenue est alors confrontée à la valeur de référence. Si le test est faux, la valeur de référence reste inchangée. Si le test est vrai, une nouvelle valeur de référence est calculée sur base de la moyenne des 3 derniers résultats. On a donc :
Produit |
NSmpl |
valeur |
Moy |
Cible |
test |
A |
1 |
28 |
/ |
/ |
/ |
A |
2 |
36 |
/ |
/ |
/ |
A |
3 |
31 |
31,67 |
31,67 |
/ |
A |
4 |
12 |
26,33 |
31,67 |
faux |
A |
5 |
15 |
19,33 |
19,33 |
vrai - rééval |
A |
6 |
25 |
17,33 |
19,33 |
faux |
B |
1 |
... |
/ |
/ |
/ |
B |
2 |
... |
/ |
/ |
/ |
Là où je bloque, c'est dans la manière de gérer cette valeur de référence. Jusqu'ici, j'utilise une fonction avec variable pour stocker la référence. Seulement, cette variable est réinitialisée à chaque ligne, et du coup je perds les changement éventuels...
Voici ma fonction :
Code:
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 27 28
| FUNCTION [dbo].[Fn_Sigma]
(
@NSmpl smallint,
@Produit smallint,
@Moy decimal(3,1)
)
RETURNS decimal(3,1)
AS
BEGIN
DECLARE @Result decimal(3,1)
DECLARE @Cible decimal(3,1)
IF @NSmpl < 3
SET @Result = null
IF @NSmpl = 3
SET @Result = (SELECT AVG(Valeur) FROM RawData WHERE (NSmpl <= 3 and NSmpl > 0) AND Produit = @Produit)
IF @NSmpl > 3
BEGIN
SET @Cible = (SELECT AVG(Valeur) FROM RawData WHERE (NSmpl <= 3 and NSmpl > 0) AND Produit = @Produit)
SET @Result = CASE WHEN @Moy < 0.8 * @Cible THEN (SELECT AVG(Valeur) FROM RawData WHERE (NSmpl <= @NSmpl and NSmpl > @NSmpl - 3) AND Produit = @Produit)
ELSE @Cible END
END
RETURN @Result
END |
Il faudrait que je puisse stocker la valeur @Cible en dehors de la fonction, mais je ne sais pas comment faire...
Merci d'avance, et bonne après-midi !