· 6 years ago · Sep 08, 2019, 04:20 PM
1DROP FUNCTION IF EXISTS rischio_cronicita;
2DELIMITER $$
3CREATE FUNCTION rischio_cronicita (Paziente VARCHAR(30), Patologia VARCHAR(30))
4RETURNS FLOAT DETERMINISTIC
5BEGIN
6 DROP TEMPORARY TABLE IF EXISTS PotenzaFarmaci;
7 CREATE TEMPORARY TABLE PotenzaFarmaci(Farmaco VARCHAR(30) NOT NULL PRIMARY KEY, PotenzaFarmaco INT);
8 INSERT INTO PotenzaFarmaci
9 SELECT F.NomeCommerciale AS Farmaco, IF(D.Farmaco IS NULL, 0, D.PotenzaFarmaco) AS PotenzaFarmaco
10 FROM (
11 SELECT T.Farmaco, COUNT(DISTINCT T.Patologia) AS PotenzaFarmaco
12 FROM terapia T
13 INNER JOIN
14 patologia PA ON T.Patologia = PA.Nome
15 NATURAL JOIN
16 esordio E
17 WHERE T.DataFineTerapia = E.DataGuarigione -- guarite
18 AND PA.Invalidita > 70
19 GROUP BY T.Farmaco
20 ) AS D
21 RIGHT OUTER JOIN
22 Farmaco F ON D.Farmaco = F.NomeCommerciale
23 GROUP BY F.NomeCommerciale;
24
25 -- per ogni terapia del paziente con quella patologia
26 DROP TEMPORARY TABLE IF EXISTS RischioTerapie;
27 CREATE TEMPORARY TABLE RischioTerapie(DataInizioTerapia DATE PRIMARY KEY, Rt FLOAT);
28 INSERT INTO RischioTerapie
29 SELECT T.DataInizioTerapia, T.Posologia * PF.PotenzaFarmaco * DATEDIFF(IFNULL(T.DataFineTerapia, CURRENT_DATE), T.DataInizioTerapia) AS Rt
30 FROM terapia T
31 NATURAL JOIN
32 PotenzaFarmaci PF
33 WHERE T.Patologia = Patologia
34 AND T.Paziente = Paziente;
35
36 -- creo il vettore normalizzato
37 DROP TEMPORARY TABLE IF EXISTS RischioTerapieNormalizzato;
38 CREATE TEMPORARY TABLE RischioTerapieNormalizzato LIKE RischioTerapie;
39 INSERT INTO RischioTerapieNormalizzato
40 SELECT RT.DataInizioTerapia, (RT.Rt - MIN(RT.Rt)) / (MAX(RT.Rt) - MIN(RT.Rt)) AS Rt
41 FROM RischioTerapie RT;
42
43 -- media normalizzata facendo la media dei valori normalizzati
44 SET @mediaNormalizzata = (
45 SELECT AVG(Rt)
46 FROM RischioTerapieNormalizzato
47 );
48 RETURN @mediaNormalizzata;
49END $$
50
51DROP PROCEDURE IF EXISTS TopTreePatologie $$
52CREATE PROCEDURE TopTreePatologie (IN Paziente VARCHAR(30))
53BEGIN
54 DECLARE finito INT DEFAULT 0;
55 DECLARE currentPat VARCHAR(30) DEFAULT '';
56 DECLARE currentRischio FLOAT DEFAULT 0;
57 DECLARE contatore INT DEFAULT 0;
58
59 DECLARE cursore_patologie CURSOR FOR
60 SELECT E.Patologia, rischio_cronicita(Paziente, E.Patologia) AS Rp
61 FROM esordio E
62 WHERE E.Paziente = Paziente
63 GROUP BY E.Patologia;
64
65 DECLARE CONTINUE HANDLER FOR NOT FOUND
66 SET finito = 1;
67
68 -- temp table per l'inserimento patologia - Rischio
69 DROP TABLE IF EXISTS PatologiaRischio;
70 CREATE TEMPORARY TABLE PatologiaRischio (
71 Patologia VARCHAR(30) NOT NULL PRIMARY KEY,
72 Rischio FLOAT NOT NULL
73 );
74
75 OPEN cursore_patologie;
76 WHILE finito = 0 DO
77 FETCH cursore_patologie INTO currentPat, currentRischio;
78
79 -- controllo sia sul rischio e sul contatore visto che solo le prime 3 patologie
80 IF currentRischio > 0.8 AND contatore < 3 THEN
81 INSERT INTO PatologiaRischio
82 VALUES (currentPat, currentRischio);
83
84 SET @stringa = CONCAT(@stringa, currentPat, "-", currentRischio, ", ");
85 SET contatore = contatore + 1;
86 END IF;
87
88 IF currentRischio > 0.8 AND contatore > 3 THEN
89 INSERT INTO PatologiaRischio
90 VALUES (currentPat, currentRischio);
91
92 SET @stringa = CONCAT(@stringa, "-HR");
93 SET contatore = contatore + 1;
94 END IF;
95
96 END WHILE;
97 CLOSE cursore_patologie;
98
99END $$
100DELIMITER ;
101
102CALL TopTreePatologie("aaa1");
103SELECT *
104FROM PatologiaRischio;