peppe_rossi

healthy_patients_in_period

Jan 21st, 2021 (edited)
437
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MySQL 1.62 KB | None | 0 0
  1. DROP PROCEDURE IF EXISTS healthy_patients_in_period;
  2. DELIMITER $$
  3.  
  4. CREATE PROCEDURE healthy_patients_in_period(IN _from DATE, IN _to DATE)
  5. BEGIN
  6.     -- Tabella con pazienti sani
  7.     DROP TEMPORARY TABLE IF EXISTS pazSani;
  8.     CREATE TEMPORARY TABLE pazSani AS (
  9.         SELECT P.CodFiscale
  10.         FROM Paziente P
  11.             INNER JOIN Esordio E
  12.             ON E.Paziente = P.CodFiscale
  13.         WHERE (
  14.             SELECT COUNT(*)
  15.             FROM Esordio E1
  16.             WHERE E1.Paziente = P.CodFiscale
  17.                 AND E1.DataEsordio < _from
  18.                 AND (E1.DataGuarigione IS NULL OR E1.DataGuarigione > _from)
  19.         ) = 0
  20.     );
  21.     -- Ultima malattia guarita (qualsiasi paz)
  22.     DROP TEMPORARY TABLE IF EXISTS daQuanto;
  23.     CREATE TEMPORARY TABLE daQuanto AS (
  24.         SELECT P.CodFiscale,
  25.             DATEDIFF(_from, MAX(E.DataGuarigione)) AS DQS
  26.         FROM Paziente P
  27.             INNER JOIN Esordio E
  28.             ON E.Paziente = P.CodFiscale
  29.         WHERE E.DataGuarigione IS NOT NULL
  30.             AND E.DataGuarigione < _from
  31.         GROUP BY P.CodFiscale
  32.     );
  33.     -- Prima malattia che si presenta (qualsiasi paz)
  34.     DROP TEMPORARY TABLE IF EXISTS perQuanto;
  35.     CREATE TEMPORARY TABLE perQuanto AS (
  36.         SELECT P.CodFiscale,
  37.             DATEDIFF(MIN(E.DataEsordio), _to) AS PQS
  38.         FROM Paziente P
  39.             INNER JOIN Esordio E
  40.             ON E.Paziente = P.CodFiscale
  41.         WHERE E.DataEsordio > _to
  42.         GROUP BY P.CodFiscale
  43.     );
  44.     -- Query finale
  45.     SELECT DISTINCT(P.CodFiscale) AS Paziente,
  46.         DQ.DQS, PQ.PQS
  47.     FROM pazSani P
  48.         LEFT OUTER JOIN daQuanto DQ
  49.             ON P.CodFiscale = DQ.CodFiscale
  50.         LEFT OUTER JOIN perQuanto PQ
  51.             ON P.CodFiscale = PQ.CodFiscale;
  52. END$$
  53.  
  54. DELIMITER ;
Add Comment
Please, Sign In to add comment