クエリで1つ前のレコードの値を取得する

 あるレコードと、その1つ前のレコードにある数値の差を求めたいといった場合があります。
 Excelだとセルに「=A20」というような式を記すだけで任意の位置にある値を参照でき、「1つ前のレコード」つまり1行上の値を参照することも全く問題ありません。しかし、AccessにはExcelのような値の位置とか座標を表す記号番号がありませんので、正確には「1つ前のレコード」という考え方も存在しません。特定の列の値に基づきレコードの順番を整理したうえで、その順番が最も近いレコードの値を参照することとなります。
 以下で例を示しますが「1つ前のレコード…」という題名も便宜的なものとお考え下さい。

レコードの順番となる連番が存在する場合

f:id:accs2014:20180708124604p:plain:right:w350

 サンプルとしてこのようなテーブルを用います。
 「観測ID」列をレコードの順番として用います。連番になっているので比較的簡単に扱うことができます。


DLookUp関数を用いる例

f:id:accs2014:20180708124558p:plain:right:w600

 わかりやすい方法です。DLookUp関数を用いることで、観測IDがそのレコードより1だけ小さいレコードから値を取得します。
 クエリのデザインビューで次のような列を設けます。


前回気温: DLookUp("気温","観測テーブルA","観測ID=" & [観測ID]-1)


f:id:accs2014:20180708124555p:plain:right:w350

 データシートビューです。
 観測IDが1のレコードについては対応する値がありませんのでNullとなります。
 なお、取得した値は左寄せされていますが、型は数値(この例の場合Long)になっています。


サブクエリを用いる例

f:id:accs2014:20180708124552p:plain:right:w600

 考え方は上記と同じですが、SQLで値を取得します。
 クエリのデザインビューで次のような列を設けます。


前回気温: (SELECT 気温 FROM 観測テーブルA AS 観測テーブルA_1 WHERE 観測テーブルA_1.観測ID = 観測テーブルA.観測ID - 1)


f:id:accs2014:20180708124651p:plain:right:w350

 データシートビューです。


レコードの順番となる連番ではない値が存在する場合

f:id:accs2014:20180708124601p:plain:right:w350

 サンプルとしてこのようなテーブルを用います。
 日付型の「日付」列をレコードの順番として用います。値が連番ではなく途切れ途切れなので、ちょっと工夫が必要です。


DLookUp関数を用いる例

f:id:accs2014:20180708124648p:plain:right:w600

 わかりやすさ優先で2段階のクエリを設けます。最初のクエリではレコードに連番を振り、次のクエリで最初の例と同じように「1つ前」の値を求めます。
 まず最初のクエリ(名前は「観測クエリB1_1」)で次のような列を設けます。

順番: DCount("日付","観測テーブルB","日付 < #" & [日付] & "#")+1

 この列は、そのレコードの日付より前の日付がいくつあるか数えて1を足していますので、結果的に連番となります。
 なお、日付型の値を比較する際の「#」の存在に注意してください。


f:id:accs2014:20180708124646p:plain:right:w350

 データシートビューです。


f:id:accs2014:20180708155016p:plain:right:w600

 こうなるとあとは最初の例と同じです。このクエリに基づく新しいクエリ(名前は「観測クエリB1_2」)をつくり、次のような列を設けます。


前回気温: DLookUp("気温","観測クエリB1_1","順番 = " & [順番]-1)


f:id:accs2014:20180708155013p:plain:right:w350

 データシートビューです。


サブクエリを用いる例

f:id:accs2014:20180708124741p:plain:right:w600

 SQLで求めます。せっかくですのでクエリが1個で済むような内容とします(順番の算出が省略されます)。
 次のような列を設けます。


前回気温: (SELECT 気温 FROM 観測テーブルB AS 観測テーブルB_1 WHERE 観測テーブルB_1.日付 = (SELECT Max(日付) FROM 観測テーブルB AS 観測テーブルB_2 WHERE 観測テーブルB_2.日付 < 観測テーブルB.日付))


f:id:accs2014:20180708124738p:plain:right:w350

 データシートビューです。