2010-08-19 9 views
0

J'ai un tableau de patients qui a les colonnes suivantes: patient_id, obs_id, obs_date. Obs_id est l'ID d'une observation clinique (telle que la lecture du poids, la lecture de la pression artérielle ... etc), et obs_date est quand cette observation a été prise. Chaque patient peut avoir plusieurs lectures à différentes dates ... etc. Actuellement, j'ai une requête pour obtenir tous les patients qui avaient obs_id = 1 et les insérer dans une table temporaire (a deux colonnes, patient_id et drapeau que je mets à 0 ici):SQL à interroger par dépendances de date

insert into temp_table (select patient_id, 0 from patients_table 
where obs_id = 1 group by patient_id having count(*) >= 1) 

J'Executer une mise à jour instruction pour définir le drapeau à 1 pour tous les patients qui ont aussi eu obs_id = 5:

UPDATE temp_table SET flag = 1 WHERE EXISTS ( 
    SELECT patient_id FROM patients_table WHERE obs_id = 5 group by patient_id having count(*)  >=1 
) v WHERE temp_table.patient_id = v.patient_id 

Voici ma question: Comment puis-je modifier les requêtes (sans les combiner ou le retrait du groupe par déclaration) de telle sorte que je peux répondre la question suivante: "obtenir tous les patients qui avaient obs_id = 5 après obs_id = 1". Si j'ajoute min (obs_date) ou max (obs_date) à la sélection de chaque requête, puis ajoute "AND v.obs_date> temp_table.obs_date" à la seconde, est-ce correct ??

La raison pour laquelle je ne dois pas supprimer le groupe par une instruction ou une combinaison est que ces requêtes sont générées par un générateur de code (à partir d'une application web) et que je voudrais faire cette modification sans gâcher le générateur de code. réécrire.

Un grand merci à l'avance,

Répondre

1

L'avantage de SQL est que cela fonctionne avec des ensembles. Vous n'avez pas besoin de créer des tables temporaires ou d'obtenir toutes les procédures.

Comme vous décrivez le problème (trouver tous les patients qui ont obs_id 5 après obs_id 1), je commence par quelque chose comme ça

select distinct p1.patient_id 
from patients_table p1, patients_table p2 
where 
p1.obs_id = 1 and 
p2.obs_id = 5 and 
p2.patient_id = p1.patient_id and 
p2.obs_date > p1.obs_date 

Bien sûr, cela ne vous aide pas à traiter avec votre code Générateur. Parfois, les outils qui facilitent les choses peuvent aussi vous gêner.

+0

merci, je comprends parfaitement. Cependant, je n'ai pas implémenté ce générateur de code, je modifie juste le code de quelqu'un d'autre. Changer la stratégie globale de génération de code n'est pas une option pour moi, c'est pourquoi je suis aux prises avec cela. – wsb3383