2

テーブル内の一連の約113000行の1つの列を更新しようとしています。問題の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

上記の情報については、3行目が遭遇000000000497の最新の許可であるため、1行目と2行目のメッセージ列を更新します。4行目が最新の許可日であるため、000000000719の5行目と6行目。

ここを検索してみましたが、何も思いつきませんでした。これのためにカーソルを作成する必要があるのか​​、それとも何のためにカーソルを作成する必要があるのか​​、私にはわかりませんでした。どんな助けでも大歓迎です。

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 に答える