2015-12-18 31 views
5

Abbiamo un database per i pazienti che mostra i dettagli delle loro diverse visite al nostro ufficio, come ad esempio il loro peso durante quella visita. Voglio generare un rapporto che restituisca la visita (una riga della tabella) in base alla differenza tra la data di quella visita e la prima visita del paziente che è il più grande valore possibile ma non superiore al numero X di giorni.MySQL - Selezionare la riga con la colonna + X> Colonna

Questo è molto chiaro, quindi mi permetta di provare un esempio. Diciamo che ho la seguente tabella chiamata patient_visits:

visit_id | created    | patient_id | weight 
---------+---------------------+------------+------- 
     1 | 2006-08-08 09:00:05 |   10 | 180 
     2 | 2006-08-15 09:01:03 |   10 | 178 
     3 | 2006-08-22 09:05:43 |   10 | 177 
     4 | 2006-08-29 08:54:38 |   10 | 176 
     5 | 2006-09-05 08:57:41 |   10 | 174 
     6 | 2006-09-12 09:02:15 |   10 | 173 

Nella mia domanda, se fossi voglia di eseguire questo rapporto per "30 giorni", vorrei restituire la riga in cui visit_id = 5, perché è di 28 giorni in il futuro, e la prossima fila è di 35 giorni nel futuro, il che è troppo.

ho provato una varietà di cose, come ad esempio l'adesione al tavolo a se stesso, o la creazione di una sottoquery nella clausola WHERE per cercare di restituire il valore massimo di created dove è uguale o inferiore a created + 30 days, ma io sembra essere in perdita a questo punto. Come ultima risorsa, posso semplicemente inserire tutti i dati in un array PHP e creare un po 'di logica, ma preferirei non farlo.

Il quadro più grande è questo: Il database ha circa 5.000 pazienti, ciascuno con un numero qualsiasi di visite ambulatoriali. Voglio compilare il rapporto per dirmi quale è stata la perdita media di attesa per tutti i pazienti combinati dalla prima visita a X giorni (cioè, X giorni dalla prima visita di ciascun paziente, non un periodo arbitrario di X-day). Spero che se riesco a risolvere il problema, sarò in grado di lavorare il resto.

+0

Lasciatemi riformulare che: per ogni paziente_id si dovrebbe prendere la * prima visita * (chiamiamola * ancora *), quindi trovare un'altra visita * più lontana * dall'ancora ma non più di X giorni dall'ancora . Tutte le altre visite (cioè quelle più vicine all'ancora e quelle superiori a X giorni) dovrebbero essere scartate. Destra? –

risposta

0

È possibile ottenere la data della prima e prossima visita utilizzando query come questa (Si noti che questo non ha sintassi corretta per la data il confronto ed è solo uno schema della query):

select 
    first_visits.patient_id, 
    first_visits.date first_date, 
    max(next_visit.created) next_date 
from (
    select patient_id, min(created) as "date" 
    from patient_visits 
    group by patient_id 
) as first_visits 
inner join patient_visits next_visit 
    on (next_visit.patient_id = first_visits.patient_id 
     and next_visit.created between first_visits.created and first_visits.created + 30 days) 
group by first_visits.patient_id, first_visits.date 

Quindi, in pratica, è necessario trovare la data di inizio utilizzando il raggruppamento per patient_id e quindi unire patient_visits e trovare la data massima all'interno della finestra dei 30 giorni.

Quindi è possibile unire il risultato per patient_visits per ottenere inizio e fine pesi e calcolare la perdita.

+0

Questo sembra andare nella giusta direzione. Sono stato in grado di modificare alcune cose sopra per renderlo una query eseguibile e restituisce le date appropriate e in 1,02 secondi. Però ho due problemi con i join. Il primo è la velocità .. ci vogliono 64 secondi per l'esecuzione. Il secondo è che non riesco a capire come partecipare alla prossima visita .. Non posso unirmi a una tabella 'ON max (next_visit.created)' o 'ON next_date'. –

Problemi correlati