2012-07-15 64 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

相關問題