2010-08-27 4 views
0

J'ai une table (PAT_PROCEDURES) avec trois colonnes: patient_id, procedure_id, procedure_date et token_id qui stocke les enregistrements concernant les patients et les procédures qu'ils ont subies ainsi que la date de la procédure ; L'ID de jeton est un identifiant numérique spécial.Requête SQL pour la date la plus récente et contrainte par une autre colonne

J'ai également une autre table (PAT_TOKENS) avec trois colonnes patient_id et token_id, il a un sous-ensemble de ces patients de la première table, mais l'identification de jeton est 0. J'essaye de mettre à jour l'identification de jeton de la procédure la plus récente effectuée à partir de la première table, où les procédures est l'un d'une liste finie de IDS procédure .... essentiellement voici ce que j'ai jusqu'à présent:

merge into pat_tokens t 
using (
    -- select all patients with most recent procedure among procedure IDs (45, 66, 78) 
) procs on (t.patient_id = procs.patient_id) 
when matched then 
update set t.token_id = procs.token_id 

la requête a commenté select est ce que je Je me bats avec.

THanks!

+0

Pour quelle base de données? –

+0

la base de données est Oracle – wsb3383

Répondre

1
select patient_id 
from PAT_procedure P 
    inner join (select procedure_id, max(procedure_date) as last_date 
       from PAT_procedure 
       where procedure_id in (45, 66, 78) 
       group by procedure_id) mx 
    on p.procedure_id = mx.procedure_id and p.procedure_date = mx.last_date 
0

Vous n'avez pas dit que le SGBD, mais en supposant SQL 2008 pour l'instant car il a MERGE ...

UPDATE t 
SET t.token_id = x.token_id 
FROM 
    pat_tokens t 
    CROSS APPLY (
     SELECT TOP 1 p.token_id 
     FROM pat_procedures p 
     WHERE 
     p.procedure_id IN (45, 66, 78) 
     AND p.patient_id = t.patient_id 
     ORDER BY p.procedure_date DESC 
    ) x 
WHERE t.token_id <> procs.token_id 

J'espère que vous avez un index sur patient_id dans pat_procedures. Ce serait génial si elle est en cluster, ou mieux si c'est un index non clusterisé avec procedure_id, token_id et procedure_date inclus, en supposant que l'index non clusterisé est plus étroit que l'index clusterisé. Ne créez pas ce dernier index si vous n'en avez pas besoin.

Je viens de réaliser que je pourrais avoir mal compris, c'est peut-être ce que vous vouliez dire:

UPDATE t 
SET t.token_id = x.token_id 
FROM 
    pat_tokens t 
    CROSS APPLY (
     SELECT TOP 1 p.token_id, p.procedure_id 
     FROM pat_procedures p 
     WHERE p.patient_id = t.patient_id 
     ORDER BY p.procedure_date DESC 
    ) x 
WHERE 
    t.token_id <> x.token_id 
    AND x.procedure_id IN (45, 66, 78) 

Voici une autre méthode, juste répondre à votre question pour l'instruction SELECT que vous cherchez cette fois:

SELECT patient_id 
FROM (
    SELECT TOP 1 * WITH TIES 
    FROM pat_procedures p 
    ORDER BY p.procedure_date DESC 
) x 
WHERE x.procedure_id IN (45, 66, 78) 

Je ne suis pas sûr d'avoir corrigé ce que vous cherchez, mais répondez en retour et je mettrai à jour si nécessaire.

MISE À JOUR

Maintenant que je sais que c'est Oracle, je ne serai pas en mesure de fouetter juste une question pour vous.

Mais je sais qu'Oracle supporte les fonctions de fenêtrage. Si vous pouvez traduire l'une de mes requêtes ci-dessus dans la syntaxe Oracle correcte qui attribue le numéro 1 à chaque ligne avec la date la plus récente dans une table dérivée, alors joignez-vous à celle où les ID de procédure sont corrects. Je vais essayer d'y revenir demain ...

+0

Désolé j'ai oublié de mentionner la base de données, c'est Oracle – wsb3383