Si consideri la realtà medica descritta dalla base di dati relazionale definita dal seguente schema:

Documenti analoghi
Si consideri la realtà medica descritta dalla base di dati relazionale definita dal seguente schema:

Si consideri la realtà medica descritta dalla base di dati relazionale definita dal seguente schema:

Si consideri la realtà medica descritta dalla base di dati relazionale definita dal seguente schema:

Si consideri la realtà medica descritta dalla base di dati relazionale definita dal seguente schema:

Si consideri la realtà medica descritta dalla base di dati relazionale definita dal seguente schema:

Si consideri la realtà medica descritta dalla base di dati relazionale definita dal seguente schema:

Si consideri la realtà medica descritta dalla base di dati relazionale definita dal seguente schema:

Si consideri la realtà medica descritta dalla base di dati relazionale definita dal seguente schema:

Si consideri la realtà medica descritta dalla base di dati relazionale definita dal seguente schema:

σ data 15/12/2013 data 20/12/2014

Basi di Dati. S Q L Lezione 4

PROVA SCRITTA DI TECNOLOGIA DATABASE 02/12/2004 Corso di Laurea Specialistica in Ingegneria Informatica - NOD PROF.

Basi di Dati. S Q L Lezione 3

Basi di Dati Corso di Laura in Informatica Umanistica

Vincoli, procedure e regole attive in SQL. SQL: vincoli, trigger 1

PROVA SCRITTA DI TECNOLOGIA DATABASE 14/12/2005 Corso di Laurea Specialistica in Ingegneria Informatica - NOD PROF.

SQL - Structured Query Language

PROVA SCRITTA DI TECNOLOGIA DATABASE 05/12/2003 Corso di Laurea Specialistica in Ingegneria Informatica - NOD PROF.

Corso di Basi di Dati A.A. 2015/2016

A.A. 2018/2019. Esercitazione 12. Strutturazione di Istruzioni in Linguaggio SQL. [ Possibili Soluzioni ] FONDAMENTI DI INFORMATICA E PROGRAMMAZIONE

Corso di. Basi di Dati I. 11. Esercitazioni in SQL: Altri esercizi

Basi di Dati Corso di Laura in Informatica Umanistica

SQL. SQL come Data Manipulation Language - Inserimento, cancellazione e aggiornamento di righe

Caso di Studio: SITI CONTAMINATI

Esercitazione 4 SQL.

A.A. 2018/2019. Esercitazione 11. Strutturazione di Istruzioni in Linguaggio SQL. [ Possibili Soluzioni ] FONDAMENTI DI INFORMATICA E PROGRAMMAZIONE

Esercitazione: Interrogazioni SQL

Progettazione di Sistemi Informatici

Sistemi di Elaborazione delle Informazioni

Basi di Dati. S Q L Lezione 5

Structured. Language. Basi di Dati. Introduzione. DDL: Data Definition Language. Tipi di dato. Query. Modifica dei Dati

PROGETTAZIONE DI DATABASE Linguaggio SQL

Basi di dati Corso di Laurea in Informatica Umanistica

Basi di dati I Prova di autovalutazione 1 novembre 2016 Soluzioni

Triggers. Antonella Poggi, Claudio Corona. Dipartimento di informatica e Sistemistica Università di Roma La Sapienza

1) Il sistema automatico di prenotazione dei posti di TicketTwo si basa sul seguente database.

Basi di Dati - Informatica umanistica Esercitazione (Lab)

SQL - Structured Query Language

SQL /10/2016 Basi di dati - SQL 1

McGraw-Hill. Soluzioni degli esercizi. Tutti i diritti riservati. Capitolo SELECT Neg_Nome FROM Negozi. 2. SELECT Neg_Cod FROM Ordini

PARTITIONING PARTITIONING. 27/11/08 /home/scotty/enrico/corso web/finale/architettura/partit page 1

Manuale SQL. Manuale SQL - 1 -

Prova Scritta di Basi di Dati

Basi di Dati Corso di Laura in Informatica Umanistica

SQL non è solo un linguaggio di interrogazione (Query Language), ma. Un linguaggio per la definizione di basi di dati (Data-definition language (DDL))

Laboratorio di Basi di Dati

SQL quick reference. piccolo manuale di riferimento dei principali comandi SQL (prof. Claudio Maccherani, Perugia, 2013)

Viene richiesto di MIN CARD(S,E) = 1 UPDATE DELETE MAX CARD(S,E) = 3 INSERT UPDATE

Stringhe di caratteri

Corso di Informatica Medica

SQL PER LA DEFINIZIONE DI BASI DI DATI

Laboratorio di Basi di Dati

Stored Procedure. Antonella Poggi. Dipartimento di informatica e Sistemistica Sapienza Università di Roma

Basi di Dati Prof. L. Tanca e F. A. Schreiber APPELLO DEL 6 MARZO 2015 Tempo: 2h30m

SQL e ACCESS. Modello relazionale PROBLEMA ENTITA STUDENTE

Cap. 7 -Trigger e loro uso

Interrogazioni in SQL

SQL Esempi. 24/10-7/11/2016 Basi di dati - SQL 1

Soluzione DDL ed Algebra Relazionale

Le fonti dati ed i metodi di analisi

Caso di Studio: SITI CONTAMINATI

Capitolo 5. Soluzione: Soluzione in C:

Operazioni scatenanti. Nozione ed uso. Sintassi. Esempio

Progetto Basi di Dati

Le Basi di Dati Attive

Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, SQL

Interrogazioni nidificate

SQL Esempi /10/2017 Basi di dati - SQL 1

Basi di Dati. S Q L Lezione 2

Aspetti avanzati nella definizione degli schemi DDL2 1

Basi di Dati: Corso di laboratorio

DDL (Data Definition Language) schemi DML (Data Manipulation Language) DQL (Data Query Language) DCL (Data Control Language)

ESERCIZI SQL. Esercizio 1

Il sistema informativo deve essere di tipo centralizzato e accessibile mediante un computer server installato nella rete locale dell albergo.

Laboratorio di PL/SQL

SQl come DML: Esercitazione

Lezione 8. Metadati, Viste e Trigger

PL/SQL e PLpgSQL. Audiolezione 28b. Necessità. Soluzioni. Embedded SQL. Alfio Ferrara - Stefano Montanelli. Estensioni procedurali di SQL

Basi di dati: appello 14/07/06

SISTEMI INFORMATIVI E TELEMEDICINA INFORMATICA MEDICA. 3. Panoramica su SQL Prof. Mauro Giacomini

Fondamenti di Informatica A. A / 1 9

23. MySQL: Stored procedures e stored functions

Basi di Dati e Sistemi Informativi A 1 A.A. 2009/ /09/10 -A Prof. Paolo Brunasti

SQL. Università degli Studi di Salerno. Corso di Laurea in Scienze della Comunicazione Informatica generale (matr. Dispari) Docente: Angela Peduto

SQL. Università degli Studi di Salerno. Corso di Laurea in Scienze della Comunicazione Informatica generale (matr. Dispari) Docente: Angela Peduto

Laboratorio di Basi di Dati e Multimedia

Soluzione esercitazione 01

Concettuale. Giuseppe Amato

Basi di Dati: Corso di laboratorio

Le Basi di Dati Attive

I.I.S. G. COSSALI - ORZINUOVI DATABASE. Marzo 2017 Prof. Dario Tomasoni 1

Interrogazioni nidificate

Tipi numerici esatti Valori interi o con parte decimale di lunghezza prefissata

Informatica documentale Laurea in Scienze della Comunicazione Prova scritta del 25 giugno Cognome e nome: Matricola:

SQL: DDL, VI, Aggiornamenti e Viste

Manuale Comandi SQL SQL. Sito per esercitarsi (on line) SQL

(Lezione SQL 1) Barbara Di Camillo Dipartimento di Ingegneria dell Informazione. Università degli Studi di Padova

A. Ferrari SQL. Structured Query Language

Transcript:

BASI DI DATI INGEGNERIA INFORMATICA PROVA PRATICA 29 GIUGNO 2015 SOLUZIONI Si consideri la realtà medica descritta dalla base di dati relazionale definita dal seguente schema: PAZIENTE(CodFiscale, Cognome, Nome, Sesso, DataNascita, Citta, Reddito) MEDICO(Matricola, Cognome, Nome, Specializzazione, Parcella, Citta) FARMACO(NomeCommerciale, PrincipioAttivo, Costo, Pezzi) PATOLOGIA(Nome, ParteCorpo, SettoreMedico, Invalidita, PercEsenzione) INDICAZIONE(Farmaco, Patologia, DoseGiornaliera, NumGiorni, AVita) VISITA(Medico, Paziente, Data, Mutuata) ESORDIO(Paziente, Patologia, DataEsordio, DataGuarigione, Gravita, Cronica) TERAPIA(Paziente, Patologia, DataEsordio, Farmaco, DataInizioTerapia, DataFineTerapia, Posologia) Risolvere i seguenti esercizi utilizzando la sintassi MySQL. La correttezza del primo esercizio è una condizione necessaria per la correzione dell intero elaborato. Quelle che seguono sono possibili soluzioni degli esercizi proposti. Soluzioni alternative sono corrette purché producano lo stesso risultato e siano semanticamente equivalenti a quelle proposte. Esercizio 1 Scrivere una query che restituisca le patologie curate sempre con il farmaco meno costoso fra tutti quelli indicati. Se, data una patologia, esiste più di un farmaco meno costoso, questi possono essere stati usati intercambiabilmente. CREATE OR REPLACE VIEW CostiMinimi AS SELECT I.Patologia, MIN(F.Costo) AS Costo FROM Indicazione I Farmaco F ON I.Farmaco = F.NomeCommerciale GROUP BY I.Patologia; SELECT T.Patologia FROM Terapia T Farmaco F ON T.Farmaco = F.NomeCommerciale CostiMinimi CM GROUP BY T.Patologia HAVING COUNT(*) = (SELECT COUNT(*) FROM Terapia T2 WHERE T2.Patologia = T.Patologia Esercizio 2 Modificare la tabella ESORDIO aggiungendo un attributo EsordiPrecedenti contenente il numero di esordi precedenti di patologie dello stesso paziente relative allo stesso settore medico, curati con successo. L attributo EsordiPrecenti deve essere aggiornato ogni cinque giorni, a partire dal 1 Luglio 2015 alle ore 6:00 del mattino. Implementare l incremental full refresh dell attributo EsordiPrecedenti scrivendo: i) il codice di gestione della log table; ii) il recurring event che realizza la funzionalità di refresh.

ALTER TABLE Esordio ADD COLUMN EsordiPrecedenti INT(11) DEFAULT NULL AFTER Cronica; CREATE TABLE Log_Guarigioni ( Paziente CHAR(100) NOT NULL, Patologia CHAR NOT NULL, DataEsordio DATE NOT NULL, PRIMARY KEY (Paziente, Patologia, DataEsordio) DROP TRIGGER IF EXISTS Push_Log; DELIMITER $$ CREATE TRIGGER Push_Log AFTER UPDATE ON Esordio FOR EACH ROW BEGIN IF (NEW.DataGuarigione IS NOT NULL AND OLD.DataGuarigione IS NULL) THEN INSERT INTO Log_Guarigioni VALUES (NEW.Paziente, NEW.Patologia, NEW.DataEsordio END IF; END $$ DROP EVENT IF EXISTS AggiornaEsordiPrecedenti $$ CREATE EVENT AggiornaEsordiPrecedenti ON SCHEDULE EVERY 5 DAY STARTS '2015-07-01 06:00:00' DO BEGIN DECLARE _paziente CHAR(100) DEFAULT ''; DECLARE _patologia CHAR(100) DEFAULT ''; DECLARE _dataesordio DATE DEFAULT NULL; DECLARE _settoremedico CHAR(100) DEFAULT ''; DECLARE finito INTEGER DEFAULT 0; DECLARE guarigioni CURSOR FOR SELECT LG.Paziente, LG.Patologia, LG.DataEsordio FROM LogGuarigioni LG ORDER BY LG.Paziente, LG.Patologia, LG.DataEsordio; DECLARE CONTINUE HANDLER FOR NOT FOUND SET finito = 1; OPEN guarigioni; scan: LOOP FETCH guarigioni INTO _paziente, _patologia, _dataesordio;

END $$ IF finito = 1 THEN LEAVE scan; END IF; SET _settoremedico = (SELECT P.SettoreMedico FROM Patologia P WHERE P.Nome = _patologia UPDATE Esordio E Patologia P ON E.Patologia = P.Nome SET EsordiPrecedenti = EsordiPrecedenti + 1 WHERE Paziente = _paziente AND P.SettoreMedico = _settoremedico AND DataEsordio > _dataesordio; /* esordi da aggiornare */ END LOOP scan; TRUNCATE Log_Guarigioni; DELIMITER ; A.A. precedente (2013-2014) Scrivere una stored procedure che implementi l on demand refresh di una tabella EsordiPrecedenti contenente, per ogni record in ESORDIO, il numero di esordi precedenti di patologie dello stesso paziente relative allo stesso settore medico, curati con successo, e il numero medio di terapie necessario per la guarigione. CREATE TABLE EsordiPrecedenti ( Paziente CHAR(100) NOT NULL, Patologia CHAR(100) NOT NULL, DataEsordio DATE NOT NULL, EsordiPrecedenti INTEGER, TerapieMedie DOUBLE, PRIMARY KEY (Paziente, Patologia, DataEsordio) DROP PROCEDURE IF EXISTS refreshesordiprecedenti; DELIMITER $$ CREATE PROCEDURE refreshesordiprecedenti() BEGIN DECLARE _paziente CHAR(100) DEFAULT ''; DECLARE _patologia CHAR(100) DEFAULT ''; DECLARE _dataesordio DATE DEFAULT NULL; DECLARE _settoremedico CHAR(100) DEFAULT ''; DECLARE _esordiprecedenti INTEGER DEFAULT 0; DECLARE finito INTEGER DEFAULT 0;

DECLARE esordi CURSOR FOR SELECT E.Paziente, E.Patologia, E.DataEsordio ; DECLARE CONTINUE HANDLER FOR NOT FOUND SET finito = 1; OPEN esordi; scan: LOOP FETCH esordi INTO _paziente, _patologia, _dataesordio; IF finito = 1 THEN LEAVE scan; END IF; SET _settoremedico := (SELECT P.SettoreMedico FROM Patologia P WHERE P.Nome = _patologia SET _esordiprecedenti := (SELECT COUNT(*) Patologia P ON E.Patologia = P.Nome WHERE E.Paziente = _paziente AND P.SettoreMedico = _settoremedico AND E.DataEsordio = < _dataesordio AND E.DataGuarigione IS NOT NULL SET _terapiemedie := (SELECT AVG(NTerapie) FROM( SELECT COUNT(*) AS NTerapie FROM Terapia T Patologia P ON T.Patologia = P.Nome WHERE T.Paziente = _paziente AND P.SettoreMedico = _settoremedico AND T.DataEsordio = < _dataesordio GROUP BY T.Paziente, T.Patologia, T.DataEsordio ) AS D REPLACE INTO EsordiPrecedenti VALUES (_paziente, _patologia, _dataesordio, _esordiprecedenti, _terapiemedie

END $$ END LOOP scan; DELIMITER ; A.A. precedente (2012-2013) Creare e popolare una tabella ridondante EsordiPrecedenti contenente, per ogni record in ESORDIO, il numero di esordi precedenti di patologie dello stesso paziente relative allo stesso settore medico, curati con successo, e il numero medio di terapie necessario per la guarigione. CREATE TABLE EsordiPrecedenti ( Paziente CHAR(100) NOT NULL, Patologia CHAR(100) NOT NULL, DataEsordio DATE NOT NULL, NumEsordiPrecedenti INTEGER, TerapieMedie DOUBLE, PRIMARY KEY (Paziente, Patologia, DataEsordio) INSERT INTO EsordiPrecedenti SELECT E.Paziente, E.Patologia, E.DataEsordio, 0, 0 ; UPDATE EsordiPrecedenti EP Patologia PA0 ON EP.Patologia = PA0.Nome SET EP.NumEsordiPrecedenti = EP.NumEsordiPrecedenti + (SELECT COUNT(*) Patologia PA ON E.Patologia = PA.Nome WHERE E.Paziente = EP.Paziente AND PA.SettoreMedico = PA0.Nome AND E.DataEsordio < EP.DataEsordio AND E.DataGuarigione IS NOT NULL UPDATE EsordiPrecedenti EP Patologia PA0 ON EP.Patologia = PA0.Nome SET EP.TerapieMedie = (SELECT COUNT(*) AS TotaleTerapie Patologia PA ON E.Patologia = PA.Nome WHERE E.Paziente = EP.Paziente AND PA.SettoreMedico = PA0.Nome AND E.DataEsordio < EP.DataEsordio AND E.DataGuarigione IS NOT NULL GROUP BY E.Paziente, E.Patologia ) / EP.NumEsordiPrecedenti;

Esercizio 3 Considerati i soli pazienti di Pisa e Roma attualmente affetti da al più tre patologie gastroenterologiche croniche, ognuno di essi visitato, negli ultimi dieci anni, almeno tre volte da un gastroenterologo di città diversa dalla sua, scrivere una query che restituisca il numero di tali pazienti che, dopo essersi fatti visitare, negli anni, da almeno un altro gastroenterologo, hanno effettuato l ultima visita nuovamente dal gastroenterologo iniziale, trascorso un tempo inferiore a sei mesi dalla prima visita. CREATE OR REPLACE VIEW VisiteTarget AS SELECT V.Paziente, V.Medico, V.Data FROM Paziente P Visita V ON P.CodFiscale = V.Paziente Medico M ON V.Medico = M.Matricola WHERE YEAR(V.Data) BETWEEN YEAR(CURRENT_DATE) - 9 AND YEAR(CURRENT_DATE) AND( P.Citta = 'Pisa' OR P.Citta = 'Roma' ) AND P.Citta <> M.Citta AND M.Specializzazione = 'Gastroenterologia'; CREATE OR REPLACE VIEW PazientiTarget AS SELECT E.Paziente Patologia PA ON E.Patologia = PA.Nome WHERE PA.SettoreMedico = 'Gastroenterologia' AND E.DataGuarigione IS NULL AND E.Cronica = 'si' AND E.Paziente IN( SELECT VT.Paziente FROM VisiteTarget VT GROUP BY VT.Paziente HAVING COUNT(*) >= 3 AND COUNT(DISTINCT VT.Data) = COUNT(*) /*nota a pag. 7*/ ) GROUP BY E.Paziente HAVING COUNT(*) <= 3; CREATE OR REPLACE VIEW PrimaUltimaVisita AS SELECT VT.Paziente, MIN(VT.Data) AS DataPrimaVisita, MAX(VT.Data) AS DataUltimaVisita FROM VisiteTarget VT GROUP BY VT.Paziente HAVING MAX(VT.Data) < MIN(VT.Data) + INTERVAL 6 MONTH; SELECT COUNT(*) FROM( SELECT VT.Paziente FROM VisiteTarget VT PrimaUltimaVisita PUV

( SELECT PT.Paziente FROM PazientiTarget PT VisiteTarget VT2 GROUP BY PT.Paziente HAVING COUNT(DISTINCT VT2.Medico) >= 2 /* almeno 2 gastro */ ) AS D GROUP BY VT.Paziente HAVING COUNT(DISTINCT VT.Medico) = 1 ) AS DD; /* NOTA: La condizione COUNT(DISTINCT VT.Data) = COUNT(*) permette di non considerare il caso, improbabile ma possibile, che un paziente target, nello stesso giorno, sia visitato da più di un gastroenterologo: data la chiave primaria di Visita, ciò è possibile. Questa eventualità deve essere scartata perché altrimenti sarebbe insensato chiedersi quali sono i pazienti che, dopo tutta la trafila, sono tornati dal primo gastroenterologo, poiché tale primo gastroenterologo potrebbe non essere unico (come già detto, nello stesso giorno, il paziente potrebbe essere stato visitato da più di un gastroenterologo). Inoltre, anche l ultimo gastroenterologo potrebbe essere non determinabile per la stessa motivazione. Questa condizione, un po insidiosa, non era necessaria per ottenere il punteggio completo dell esercizio. In questo contesto, si può supporre che, per una business rule della clinica, dato un giorno, un paziente possa effettuare al massimo una visita per specializzazione. */