2012-02-22 5 views
1

と比較します。私は適度な大きさのテーブル(TBL)を持っている人のための日付で次のレコードを検索し、その最初の記録

テーブルの各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" 

トリッキーなビットは、日付によって、私はその人のために何を次の結果を知りたいということですが、上記の基準を満たしたレコードごとにあります。私は2つの結果を比較し、結果が変わったかどうかを確認したい。結果BはJoe Bloggs(成果の名前)の結果と1か月間に「N」から「P」に変わる可能性があり、それをキャプチャする必要があります。

私はアクセス2010でサブクエリを使用する必要があると確信していますが、どうやってそれを行うのがうまくいかないのです。

+2

FYI 20kレコードで大量のレコードを呼び出すと面白いようです... – JNK

+0

大丈夫です。適度なサイズです。私が数百のレコードを扱うのに慣れたときは、私のためには大変です:p – jameslagan

+0

データベースでは、数億〜数十億行のテーブルが一般的です。 – JNK

答えて

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" 

私はコメントの通り、b.idを含めるようにORDER BY b.adateを編集しました。 Accessは一致したレコードを返します。同じ日付に複数のレコードがある場合は、Top 1から複数のレコードが返されます。

+0

ありがとうございます - 私はエラーが発生します: "このサブクエリで最大1つのレコードを返すことができます" – jameslagan

+0

また、あなたは意味しました(SELECT TOP 1 b.resulta FROM tbl ** AS ** b ...) – jameslagan

+0

いいえ、私テーブルのエイリアスには必要ないので、 'As b'を意味しませんでした。投稿する前にクエリをテストしました。しかし、私はすべてのアンダースコアを戻していないことに気付きます。 – Fionnuala

関連する問題