2012-02-22 85 views
1

我有一个中等大小的表(TBL):查找日期下记录的人,这与比较它们的初始记录

id, 
person_id, 
date, 
resultA, 
resultB, 
resultC, 
resultD 

约20000结果。

表格的每个id对应于4个不同测试中的人员结果以及他们的person_id。

例如

id 1 
person_id 2 (Joe Bloggs (made up name)) 
result on date (01/01/2012) 
A positive, 
B negative, 
C negative, 
D negative 

我需要执行一个查询,其中它选择其中一个结果为正数而其余为负值的记录。简单!

SELECT id, person_id, date, resultA, resultB, resultC, resultD 
FROM tbl 
WHERE resultA = "P" AND resultB = "N" AND resultC = "N" AND resultD = "N" 

棘手的一点是,我想找出此人的下一个结果,按日期,是对每个符合上述条件的记录。然后我想比较两个结果,看看结果是否已经改变。即结果B可能会在Joe Bloggs(制作名称)结果之间的一个月的说法中从“N”改变为“P”,并且我需要捕获该结果。

我相信我需要在访问2010年使用子查询,但我不能完全解决如何做到这一点。

+2

仅供参考如果您打电话记录为20k条记录“大量”,您会看到一些有趣的外观... – JNK 2012-02-22 14:27:44

+0

好的...这是一个中等大小。当我习惯于处理几百条记录时,这对我来说很重要:p – jameslagan 2012-02-22 14:29:35

+0

在数据库中,具有数亿或数十亿行的表是常见的。 – JNK 2012-02-22 14:31:00

回答

1

我已将日期更改为日期,因为日期是保留字。这只会为ResultA返回一个额外的列,但子查询可以为每个结果重复。

SELECT a.id, 
     a.person_id, 
     a.adate, 
     a.resulta, 
     a.resultb, 
     a.resultc, 
     a.resultd, 
     (SELECT TOP 1 b.resulta 
     FROM tbl b 
     WHERE b.person_id = a.person_id 
       AND b.adate > a.adate 
     ORDER BY b.adate, b.id) AS res 
FROM tbl AS a 
WHERE a.resulta = "P" 
     AND a.resultb = "N" 
     AND a.resultc = "N" 
     AND a.resultd = "N" 

我已经编辑ORDER BY b.adate包括b.id,按照意见。 Access返回匹配的记录,如果某人在同一天有多条记录,Top 1将返回多条记录。

+0

谢谢 - 虽然我收到一个错误:“最多只能有一条记录可以通过此子查询返回” – jameslagan 2012-02-22 14:39:30

+0

您是否也指过(SELECT TOP 1 b.resulta FROM tbl ** AS ** b ...) – jameslagan 2012-02-22 14:41:15

+0

不,我并不意味着'作为b',因为表别名不需要。我在发布之前测试了查询。但是,我注意到我没有把所有的下划线都放回去。 – Fionnuala 2012-02-22 14:50:39