2012-07-15 63 views
2

我想更新表中约113000行的系列中的一列。我有一张桌子,里面有一个MRN,遇到并接纳有问题的专栏。我遇到了一个问题,即遇到多次进入这个表格,但有不同的MRNS。我想更新一个名为'Message'的列,其值为'duplicate encounter',但只有当这次遭遇不是最新的入场日期。更新表列,其中一列是最大值

例如

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行是其最新的入场日期。

我试图通过这里寻找,但未能拿出任何东西。我只是不知道是否需要为此创建一个游标或什么。任何帮助将非常感激。

+0

针对上述情况,它没有格式我怎么过的 – 2012-07-15 22:01:15

+0

遇到000000000497将有3项,与MRNs不同的...我会更新2年长的消息栏承认的日期,不做任何最新每次遇到明确的录取日期 – 2012-07-15 22:02:17

+0

什么数据库和版本? – 2012-07-15 22:05:01

回答

2

你可以这样做:

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关联的遭遇与它相关联,并且它也获得每个遇到的最大入场日期。

它从子查询返回的遭遇相匹配,但不与最近承认,日更新的行然后,我们只更新行。

+0

太棒了......谢谢! – 2012-07-15 23:04:53

2

您可以使用子查询,找到最近的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 
+0

完美,谢谢SOO SOOO很多!像魅力一样工作 – 2012-07-15 22:23:10

+0

无论您的解决方案是否具有多个不同的MRN,您的解决方案都会更新所有遇到的问题(减去最大承诺日期的问题)。我相信OP只想更新与其关联的不止一个不同的MRN的遭遇。 – 2012-07-15 22:23:11

+0

他在MRNs不同的问题上说。 – 2012-07-16 06:39:45

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 
+0

从未见过Rank功能......感谢KEvin – 2012-07-15 23:04:10

相关问题