2012-02-22 19 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