Ciao a tutti, vorrei trasformare un calcolo rolling sviluppato in sql in una procedura pl/sql.
Nel dettaglio, presa una tabella composta da due campi, data e valore numerico, ottengo un terzo campo, risultato della media dei 6 giorni precedenti a quello considerato + quest'ultimo (il calcolo non lo effettuo per i primi sette giorni):
codice:
DAYS TOT ROLLING
01-set 9 0
03-ago 0 0
04-ago 2 0
05-ago 4 0
06-ago 5 0
07-ago 5 0
08-ago 0 4
09-ago 0 2
10-ago 3 3
11-ago 6 3
12-ago 2 3
13-ago 4 3
14-ago 0 2
15-ago 0 2
16-ago 0 2
17-ago 4 2
18-ago 4 2
19-ago 0 2
20-ago 3 2
21-ago 2 2
22-ago 2 2
23-ago 0 2
24-ago 6 2
25-ago 8 3
26-ago 4 4
27-ago 6 4
28-ago 3 4
29-ago 0 4
30-ago 0 4
31-ago 9 4
Il codice utilizzato è il seguente:
codice:
SELECT tot.days, tot.ripetuti as tot,
CASE
WHEN ROWNUM = 7
THEN (SELECT xx
FROM (SELECT ROUND
(AVG (CASE
WHEN ROWNUM > 0
AND ROWNUM < 8
THEN ripetuti
END
),
0
) AS xx
FROM totale.tot)
WHERE xx IS NOT NULL)
WHEN ROWNUM = 8
THEN (SELECT xx
FROM (SELECT ROUND
(AVG (CASE
WHEN ROWNUM > 1
AND ROWNUM < 9
THEN ripetuti
END
),
0
) AS xx
FROM totale.tot)
WHERE xx IS NOT NULL)
WHEN ROWNUM = 9
THEN (SELECT xx
FROM (SELECT ROUND
(AVG (CASE
WHEN ROWNUM > 2
AND ROWNUM < 10
THEN ripetuti
END
),
0
) AS xx
FROM totale.tot)
WHERE xx IS NOT NULL)
WHEN ROWNUM = 10
THEN (SELECT xx
FROM (SELECT ROUND
(AVG (CASE
WHEN ROWNUM > 3
AND ROWNUM < 11
THEN ripetuti
END
),
0
) AS xx
FROM totale.tot)
WHERE xx IS NOT NULL)
WHEN ROWNUM = 11
THEN (SELECT xx
FROM (SELECT ROUND
(AVG (CASE
WHEN ROWNUM > 4
AND ROWNUM < 12
THEN ripetuti
END
),
0
) AS xx
FROM totale.tot)
WHERE xx IS NOT NULL)
WHEN ROWNUM = 12
THEN (SELECT xx
FROM (SELECT ROUND
(AVG (CASE
WHEN ROWNUM > 5
AND ROWNUM < 13
THEN ripetuti
END
),
0
) AS xx