Sql 更新一列为最大值的表列

Sql 更新一列为最大值的表列,sql,duplicates,Sql,Duplicates,我试图更新一个表中大约113000行的系列中的一列。我有一个表,其中有一个MRN,遭遇,和承认列的问题。我遇到过这样一个问题,一次遭遇被多次输入到这个表中,但使用了不同的MRN。我想用值“重复遭遇”更新名为“消息”的列,但前提是该遭遇不是最新的允许日期 比如说 Encounter MRN Admitted 000000000497 0000097778 2006-01-04 20:

我试图更新一个表中大约113000行的系列中的一列。我有一个表,其中有一个MRN,遭遇,和承认列的问题。我遇到过这样一个问题,一次遭遇被多次输入到这个表中,但使用了不同的MRN。我想用值“重复遭遇”更新名为“消息”的列,但前提是该遭遇不是最新的允许日期

比如说

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行是其最新的接收日期


我试着在这里搜索,但找不到任何东西。我只是不知道我是否需要为这个或什么创建一个光标。任何帮助都将不胜感激

您可以使用子选择来查找每个遇到者的最新允许人数:

您还可以使用连接:

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
你可以做:

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的遭遇,并且还获取每个遭遇的最大允许日期

然后,我们只更新与从子选择返回的遭遇匹配的行,但不使用最近的接纳日期更新该行。

您也可以使用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

对于上面的内容,它没有格式化我的iTunesCounter 000000000497将有3个条目,由于MRN不同…我会更新消息列中的两个较旧的接纳日期,并且不会对每次遭遇的最新接纳日期执行任何操作。如果您有两行具有相同遭遇和相同接纳,那么应该发生什么?SQL 2008…没有两行具有相同遭遇和相同接纳。这里是一个示例每次遭遇的最大允许日期选择遭遇,从他的..hpf_enc中最大允许,遭遇在'000000000 497','000000000 719',“00000000 3390”按遭遇分组我不知道如何将其转换为相反的更新…意思是如果不是该密码的最大允许日期,则更新消息列这只是3次遭遇的抽样…可能有113900行。您的解决方案将更新所有遭遇,减去具有最大允许日期的遭遇不管他们是否有多个不同的MRN。我相信OP只想更新有多个不同MRN的遭遇战。他在问题中说MRN是不同的。
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