Lists: | pgsql-it-generale |
---|
From: | nicola zandonà <nick(dot)zando(at)gmail(dot)com> |
---|---|
To: | pgsql-it-generale(at)postgresql(dot)org |
Subject: | gestione dei periodi |
Date: | 2009-11-18 12:59:35 |
Message-ID: | B8B20269-DF1B-47A5-B179-FFEC129BA407@gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-it-generale |
Ciao a tutti!
Ho una tabella dove vengono descritte delle zone di alcuni pazienti di
un servizio
la tabella è cosi composta:
codice: chiave della tabella
paziente: id del paziente
zona : zona del paziente
data_inizio: data di ingresso nella zona (campo di tipo date)
data_fine: data di uscita dalla zona (campo di tipo date)
Il problema è che mancano tutte le informazioni di data_fine, cosi ad
esempio ho:
codice | paziente | zona | data_inizio | data_fine
01 1 3 2007-01-01
03 1 4 2009-01-10
Esite il modo di completare data_fine con la data_inizio del periodo
successivo dello stesso paziente?
Grazie in anticipo!
From: | gabriele(dot)bartolini(at)2ndquadrant(dot)it |
---|---|
To: | pgsql-it-generale(at)postgresql(dot)org |
Subject: | Re: gestione dei periodi |
Date: | 2009-11-18 18:00:52 |
Message-ID: | 4B043654.1070203@2ndQuadrant.it |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-it-generale |
Ciao Nicola,
nicola zandonà ha scritto:
> Esite il modo di completare data_fine con la data_inizio del periodo
> successivo dello stesso paziente?
Potresti fare una stored procedure che aggiorna questa informazione in
modalità 'batch'.
Se disponi di PG 8.4 e vuoi sperimentare, potresti anche provare le
common table expression ricorsive (standò però attento a non andare in
loop infinito).
Oppure mettere un trigger nell'inserimento di un nuovo record.
Ad ogni modo, ti consiglio di non usare 'NULL' come data fine per il
record corrent, ma di mettere una data fittizia in là con il tempo, al
fine di semplificare le query.
Ciao,
Gabriele
--
Gabriele Bartolini - 2ndQuadrant Italia
PostgreSQL Training, Services and Support
gabriele(dot)bartolini(at)2ndQuadrant(dot)it | www.2ndQuadrant.it
From: | Mirko Pace <mirkop82(at)gmail(dot)com> |
---|---|
To: | nicola zandonà <nick(dot)zando(at)gmail(dot)com> |
Cc: | "pgsql-it-generale(at)postgresql(dot)org" <pgsql-it-generale(at)postgresql(dot)org> |
Subject: | Re: gestione dei periodi |
Date: | 2009-11-18 18:35:38 |
Message-ID: | ED0A4624-C5E7-4FC5-B0F9-6C566DA0D726@gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-it-generale |
Inviato da iPhone
Il giorno 18/nov/2009, alle ore 13.59, nicola zandonà <nick(dot)zando(at)gmail(dot)co
m> ha scritto:
> Ciao a tutti!
> Ho una tabella dove vengono descritte delle zone di alcuni pazienti
> di un servizio
> la tabella è cosi composta:
>
> codice: chiave della tabella
> paziente: id del paziente
> zona : zona del paziente
> data_inizio: data di ingresso nella zona (campo di tipo date)
> data_fine: data di uscita dalla zona (campo di tipo date)
>
> Il problema è che mancano tutte le informazioni di data_fine, cosi a
> d esempio ho:
>
> codice | paziente | zona | data_inizio |
> data_fine
> 01 1 3 2007-01-01
> 03 1 4 2009-01-10
>
> Esite il modo di completare data_fine con la data_inizio del periodo
> successivo dello stesso paziente?
>
>
> Grazie in anticipo!
>
>
>
> --
> Sent via pgsql-it-generale mailing list (pgsql-it-generale(at)postgresql(dot)org
> )
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-it-generale
From: | nicola zandonà <nick(dot)zando(at)gmail(dot)com> |
---|---|
To: | Gianni Ciolli <gianni(dot)ciolli(at)2ndquadrant(dot)it> |
Cc: | pgsql-it-generale(at)postgresql(dot)org |
Subject: | Re: gestione dei periodi |
Date: | 2009-11-18 20:07:31 |
Message-ID: | 4509A838-7207-4E00-ABA9-C59C7BF2D151@gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-it-generale |
Ciao Gianni,
Grazie per la tua soluzione, non ho mai scritto una stored procedure
quindi mi documento a riguardo.
Non c'è problema per gestire il numero di record, non sono molti record.
L'alternativa che ho in mente: un trigger che vada a completare il
campo mancante agendo su una copia della tabella che ho attualmente.
Ciao,
Nicola
Il giorno 18/nov/09, alle ore 20:49, Gianni Ciolli ha scritto:
> On Wed, Nov 18, 2009 at 01:59:35PM +0100, nicola zandonà wrote:
>> Esite il modo di completare data_fine con la data_inizio del periodo
>> successivo dello stesso paziente?
>
> Per fare questo io scriverei una stored procedure
> aggiorna_data_fine_paziente, la quale accetta come input l'id del
> paziente, e svolge la seguente operazione: scorre tutti i record di
> quel paziente in ordine "prima il più recente", e aggiorna la
> data_fine di ogni record con la data_inizio del record precedente,
> ovviamente solo dal secondo record in poi.
>
> Poi non ti rimane che fare
>
> SELECT aggiorna_data_fine_paziente(codice)
> FROM (SELECT DISTINCT codice FROM tabella) x;
>
> in questo modo la stored procedure verrà eseguita esattamente una
> volta per ogni paziente.
>
> Dovrebbe funzionare agilmente su un server normale, quale che sia il
> numero (ragionevole) di pazienti: il caso assurdo di un ospedale con
> mille posti letto che ospita mille pazienti diversi al giorno per
> cinquant'anni di fila totalizza 18 milioni di pazienti; il caso
> assurdo di un paziente che è stato in ospedale 100 anni avendo
> cambiato reparto ogni ora non raggiunge gli 800000 record.
>
> Ciao
> Dr. Gianni Ciolli - 2ndQuadrant Italia
> PostgreSQL Training, Services and Support
> gianni(dot)ciolli(at)2ndquadrant(dot)it | www.2ndquadrant.it
From: | Mirko Pace <mirkop82(at)gmail(dot)com> |
---|---|
To: | nicola zandonà <nick(dot)zando(at)gmail(dot)com> |
Cc: | "pgsql-it-generale(at)postgresql(dot)org" <pgsql-it-generale(at)postgresql(dot)org> |
Subject: | Re: gestione dei periodi |
Date: | 2009-11-18 20:43:35 |
Message-ID: | 8eae94e10911181243y695a3f49k4ca0ce9dc1080b6f@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-it-generale |
Senza cte e senza sp devi far girare due query n-1 volte, dove n è il
numero di occorrenze del paziente più frequente:
update
my_pazienti
set
fine = '2100-01-01'
from
(select
id_paz,
min(inizio)
from
my_pazienti
where
fine is null
group by
id_paz) b
where
my_pazienti.id_paz = b.id_paz
and
my_pazienti.inizio = b.min ;
update
my_pazienti
set
fine = b.min
from
(select
id_paz,
min(inizio)
from
my_pazienti
where
fine is null
group by
id_paz) b
where
my_pazienti.fine = '2100-01-01'
and
my_pazienti.id_paz = b.id_paz;
Mirko
Il giorno 18/nov/2009, alle ore 13.59, nicola zandonà <nick(dot)zando(at)gmail(dot)co
m> ha scritto:
> Ciao a tutti!
> Ho una tabella dove vengono descritte delle zone di alcuni pazienti
> di un servizio
> la tabella è cosi composta:
>
> codice: chiave della tabella
> paziente: id del paziente
> zona : zona del paziente
> data_inizio: data di ingresso nella zona (campo di tipo date)
> data_fine: data di uscita dalla zona (campo di tipo date)
>
> Il problema è che mancano tutte le informazioni di data_fine, cosi a
> d esempio ho:
>
> codice | paziente | zona | data_inizio |
> data_fine
> 01 1 3 2007-01-01
> 03 1 4 2009-01-10
>
> Esite il modo di completare data_fine con la data_inizio del periodo
> successivo dello stesso paziente?
>
>
> Grazie in anticipo!
>
>
>
> --
> Sent via pgsql-it-generale mailing list (pgsql-it-generale(at)postgresql(dot)org
> )
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-it-generale