2

Accessには、特定の医療処置の患者ID、日付/時刻、および医師名を記録するテーブルがあります。同じ日に実行された繰り返しテストを識別して分類し、それに応じてコードを適用する方法を考え出す必要があります。誰かに手動で更新させるのではなく、コードフィールドを自動的に更新する方法を見つけたいと思います(これは現在行われている方法であり、エラーが発生しやすい可能性があります)。私のテーブルは次のようになります。

Patient_id  Test_date_time      Doctor id    Code
----------  ------------------  ---------    -------
123         4/2/2012  08:00 AM  SMITH_J
123         4/2/2012  12:01 PM  SMITH_J     
123         4/3/2012  11:00 AM  SMITH_J
123         5/1/2012  10:00 AM  SMITH_J
123         5/1/2012  07:00 PM  SMITH_J
123         5/1/2012  08:00 PM  JONES_B
123         5/1/2012  10:00 PM  SMITH_J    

次の基準に基づいてテーブルを更新する必要があります。

同じ医師が同じ日に実行するすべての繰り返し手順について、コード= 76にします(ただし、特定の日の最初のテストではコードを空白のままにします)。

同じ日に、ただし別の医師によって実行される繰り返し手順のコード= 77にします(ただし、最初に発生するコードは空白のままにします)。

言い換えると、ログを検索して、患者が同じ日にテストを実行したすべてのインスタンスを見つけ、これらの繰り返し手順のコードを、医師が最初の発生と同じである場合は76、医師が異なる場合は77にします。最初の発生より。

上記の例では、望ましい結果は次のとおりです。

Patient_id  Test_date_time      Doctor_id    Code
----------  ------------------  ---------   -------
123         4/2/2012  08:00 AM  SMITH_J     
123         4/2/2012  12:01 PM  SMITH_J     76
123         4/3/2012  11:00 AM  SMITH_J     
123         5/1/2012  10:00 AM  SMITH_J
123         5/1/2012  07:00 PM  SMITH_J     76
123         5/1/2012  08:00 PM  JONES_B     77
123         5/1/2012  10:00 PM  SMITH_J     76     

Test_date_timeフィールドは、Date/Timeフィールドとしてフォーマットされます。テーブルはdate_timeフィールドでソートされていません。Patient_idは患者に固有の番号であり、Doctor_idは医師に固有の文字列です。

どこから始めればいいのか、日付を比較するための情報をどのように保存するのかさえわかりません。この種の状況をどのように攻撃できるかについてのアイデアはありますか?

4

2 に答える 2

1

{Patient_id, Test_Date_type次のクエリは、特定の}のコードに 76 または 77 の値が必要かどうかを判断します。

残念ながら、これは更新可能なクエリでは使用できません。MSDN の記事で示唆されているように、2 つのオプションがあります。1) 結果をループして各レコードを更新するか、結果を一時テーブルに挿入してから、その一時テーブルを使用して更新を行います。

SELECT Ptests.Patient_id, 
       Ptests.Test_date_time, 
       Iif(SeventySixers.Patient_id IS NULL, 77, 76) AS Code 
FROM   (PTests 
        LEFT JOIN (SELECT MAX(Test_date_time) AS last_date_time, 
                          Patient_id 
                   FROM   PTests AS t1 
                   GROUP  BY Datevalue(test_date_time), 
                             Patient_id, 
                             Doctor_id 
                   HAVING COUNT(*) > 1) AS SeventySixers 
          ON ( PTests.Test_date_time = SeventySixers.last_date_time ) 
             AND ( PTests.Patient_id = SeventySixers.Patient_id )) 
       LEFT JOIN (SELECT MAX(Test_date_time) AS last_date_time, 
                         Patient_id 
                  FROM   PTests AS t1 
                  GROUP  BY Datevalue(test_date_time), 
                            Patient_id 
                  HAVING COUNT(*) > 1) AS SeventySevens 
         ON ( PTests.Test_date_time = SeventySevens.last_date_time ) 
            AND ( PTests.Patient_id = SeventySevens.Patient_id ) 
WHERE  (( NOT ( SeventySixers.Patient_id ) IS NULL )) 
        OR (( NOT ( SeventySevens.Patient_id ) IS NULL )); 

テストに使用するステートメントを作成して挿入する

CREATE TABLE [PTests]
    ([Patient_id] int, [Test_date_time] datetime, [Doctor_id] varchar(7), [Code] int);

INSERT INTO [PTests]
    ([Patient_id], [Test_date_time], [Doctor_id], [Code])
VALUES
    (123, #2012-04-02 08:00:00#, 'SMITH_J', null);

INSERT INTO [PTests]
    ([Patient_id], [Test_date_time], [Doctor_id], [Code])
VALUES
    (123, #2012-04-02 12:01:00#, 'SMITH_J', null);

INSERT INTO [PTests]
    ([Patient_id], [Test_date_time], [Doctor_id], [Code])
VALUES
    (123, #2012-04-03 11:00:00#, 'SMITH_J', null);

INSERT INTO [PTests]
    ([Patient_id], [Test_date_time], [Doctor_id], [Code])
VALUES
    (123, #2012-05-01 10:00:00#, 'SMITH_J', null);


INSERT INTO [PTests]
    ([Patient_id], [Test_date_time], [Doctor_id], [Code])
VALUES
    (123, #2012-05-01 19:00:00#, 'SMITH_J', null);

INSERT INTO [PTests]
    ([Patient_id], [Test_date_time], [Doctor_id], [Code])
VALUES
    (123, #2012-05-01 20:00:00#, 'JONES_B', null);        
于 2012-05-02T16:53:24.630 に答える
0

このようなクエリは、患者が同じ日に複数の行を持っている場所までエントリをフィルター処理します。

SELECT source.*
    FROM Table1 as source
      left join table1 as joined
         on source.patient_id = joined.patient_id 
           and DateValue(source.test_date_time) = DateValue(joined.test_date_time)
           and source.test_date_time <> joined.test_date_time
      WHERE joined.patient_id is not null

これは与える:

Patient_id  Test_date_time          Doctor_id    Code           
----------  ------------------      ---------   -------           
123         5/2/2012 1:05:00 AM     smith_j 
123         5/2/2012 12:50:00 AM    smith_j     76
123         5/1/2012 10:00:00 AM    smith_j 
123         5/1/2012 8:00:00 PM     jones_b     77

次に、クエリ結果 (RecordSet) を反復処理し、doctor_id 値の最初の出現との比較に基づいて行に 76 または 77 を割り当てる、ある種の手続き型コードが必要になります。

繰り返しで他の患者/日に踏み込まないように、レコードセットの患者 ID と DatePart(test_date_time) に対してフィルターまたは GROUP BY を実行することをお勧めします。

于 2012-05-02T05:55:51.413 に答える