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