2012-07-15 4 views
2

J'essaie de mettre à jour une colonne dans une série d'environ 113000 lignes dans un tableau. J'ai une table où il y a un MRN, rencontrer, et admettre des colonnes en question. J'ai rencontré un problème où une rencontre a été inscrite dans ce tableau plusieurs fois, mais avec des MRNS différents. Je veux mettre à jour une colonne appelée 'Message' avec une valeur 'rencontre en double' mais SEULEMENT si cette rencontre n'est pas la date admise la plus courante.Mise à jour de la colonne du tableau où une colonne est la valeur maximale

Par exemple

Encounter    MRN      Admitted 
000000000497   0000097778    2006-01-04 20:26:00 
000000000497   0000092892    2006-03-17 09:51:00 
000000000497   0000003023    2008-08-15 09:50:00 
000000000719   0000103691    2008-10-16 14:45:00 
000000000719   0000048708    2006-05-26 08:04:00 
000000000719   0000024123    2006-01-09 15:43:00 
000000003390   0000099595    2006-03-13 11:30:00 
000000003390   0000079713    2010-04-22 14:40:00 

Pour les informations ci-dessus, je veux mettre à jour la colonne de message pour la ligne 1 et 2 parce que la ligne 3 est admis les plus récentes pour la rencontre 000000000497. lignes 5 et 6 pour 000000000719 parce que la ligne 4 est sa date d'admission la plus récente.

J'ai essayé de chercher par ici, mais je n'ai rien trouvé. Je ne savais pas si j'avais besoin de créer un curseur pour ça ou quoi. Toute aide sera la bienvenue.

+0

pour ce qui précède, il n'a pas le format que je l'avais –

+0

rencontre 000000000497 aurait 3 entrées, avec MRNS différents ... Je mettre à jour les 2 plus avouent dans la colonne dates message et ne rien faire pour le plus courant admettre distinctement la date pour chaque rencontre –

+0

Quelle base de données et quelle version? –

Répondre

2

Vous pouvez faire:

UPDATE a 
SET a.Message = 'Duplicate Encounter' 
FROM tbl a 
INNER JOIN 
(
    SELECT encounter, MAX(admitted) AS maxadmitted 
    FROM tbl 
    GROUP BY encounter 
    HAVING MAX(MRN) <> MIN(MRN) 
) b ON a.encounter = b.encounter AND a.admitted <> b.maxadmitted 

La sous-sélection obtient seulement les rencontres qui ont plus d'une association MRN distincte Il reçoit également la date maximum admise pour chacune de ces rencontres.

Nous mettons seulement à jour les lignes où elles correspondent aux rencontres renvoyées par la sous-sélection, mais ne mettent pas à jour la ligne avec la date admise la plus récente.

+0

Génial ... Merci! –

2

Vous pouvez utiliser un sous-ensemble pour trouver les plus récentes Admitted pour chaque Encouter:

UPDATE T1 
SET Message = 'Duplicate' 
FROM his..hpf_enc AS T1 
WHERE Admitted <> 
(
    SELECT MAX(Admitted) 
    FROM his..hpf_enc AS T2 
    WHERE T1.Encounter = T2.Encounter 
) 

Vous pouvez également utiliser une jointure:

UPDATE T1 
SET Message = 'Duplicate' 
FROM his..hpf_enc T1 
JOIN 
(
    SELECT Encounter, MAX(Admitted) AS Admitted 
    FROM his..hpf_enc 
    GROUP BY Encounter 
) AS T2 
ON T1.Encounter = T2.Encounter 
WHERE T1.Admitted <> T2.Admitted 
+0

parfait, merci SOO SOOO MUCH !!!travaillé comme un charme –

+0

Vos solutions mettront à jour toutes les rencontres (moins celles avec les dates max admises) qu'elles aient ou non plusieurs MRN distincts. Je crois que le PO veut seulement mettre à jour les rencontres auxquelles plusieurs MRN distincts sont associés. –

+0

Il dit dans la question que les MRN sont différents. –

0

Vous pouvez également utiliser la fonction RANK().

UPDATE a 
SET a.Message = 'duplicate encounter' 
FROM MyTable a 
    INNER JOIN (
     SELECT Encounter 
      ,MRN 
      ,RANK() OVER(PARTITION BY Encounter ORDER BY Admitted DESC) AS RankVal 
     FROM MyTable) b 
    ON a.Encounter = b.Encounter 
    AND a.MRN = b.MRN 
    AND b.RankVal <> 1 
+0

n'a jamais vu la fonction Rank ... merci KEvin –

Questions connexes