2

我正在尝试更新表中一系列约 113000 行中的一列。我有一张表,其中有一个 MRN、遇到和承认有问题的列。我遇到了一个问题,一次遭遇多次进入此表,但使用不同的 MRNS。我想用值“重复遭遇”更新一个名为“消息”的列,但前提是该遭遇不是最新的承认日期。

例如

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

对于上述信息,我想更新第 1 行和第 2 行的消息列,因为第 3 行是遇到 000000000497 的最新承认。第 5 行和第 6 行是 000000000719,因为第 4 行是其最新的承认日期。

我试过在这里搜索,但什么都想不出来。我只是不知道我是否需要为此或什么创建一个游标。任何帮助将不胜感激。

4

3 回答 3

4

你可以做:

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

子选择仅获取与多个不同的 MRN 相关联的遭遇,并且它还获取每个遭遇的最大允许日期。

然后,我们只更新与从子选择返回的遭遇匹配的行,但不更新具有最近允许日期的行。

于 2012-07-15T22:17:46.090 回答
3

您可以使用子选择来查找Admitted每个的最新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
)

您还可以使用连接:

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
于 2012-07-15T22:14:07.403 回答
0

您也可以使用该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
于 2012-07-15T22:31:32.153 回答