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 字段排序。Patient_id 是患者独有的数字,Doctor_id 是医生独有的字符串。

我什至不确定从哪里开始或如何存储信息以比较日期。有什么想法可以解决这种情况吗?

4

2 回答 2

1

以下查询将确定您是否需要给定代码的 76 或 77 值{Patient_id, Test_Date_type}

遗憾的是,这不能在可更新查询中使用。正如 MSDN 文章建议的那样,您有两种选择。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),并根据与第一次出现的医生 ID 值的比较为行分配 76 或 77。

您可能希望对记录集中的患者 ID 和 DatePart(test_date_time) 进行过滤或 GROUP BY,以确保您不会在迭代中进入其他患者/天。

于 2012-05-02T05:55:51.413 回答