あるレコードと、その1つ前のレコードにある数値の差を求めたいといった場合があります。
Excelだとセルに「=A20」というような式を記すだけで任意の位置にある値を参照でき、「1つ前のレコード」つまり1行上の値を参照することも全く問題ありません。しかし、AccessにはExcelのような値の位置とか座標を表す記号番号がありませんので、正確には「1つ前のレコード」という考え方も存在しません。特定の列の値に基づきレコードの順番を整理したうえで、その順番が最も近いレコードの値を参照することとなります。
以下で例を示しますが「1つ前のレコード…」という題名も便宜的なものとお考え下さい。
レコードの順番となる連番が存在する場合
サンプルとしてこのようなテーブルを用います。
「観測ID」列をレコードの順番として用います。連番になっているので比較的簡単に扱うことができます。
DLookUp関数を用いる例
わかりやすい方法です。DLookUp関数を用いることで、観測IDがそのレコードより1だけ小さいレコードから値を取得します。
クエリのデザインビューで次のような列を設けます。
前回気温: DLookUp("気温","観測テーブルA","観測ID=" & [観測ID]-1)
データシートビューです。
観測IDが1のレコードについては対応する値がありませんのでNullとなります。
なお、取得した値は左寄せされていますが、型は数値(この例の場合Long)になっています。
サブクエリを用いる例
考え方は上記と同じですが、SQLで値を取得します。
クエリのデザインビューで次のような列を設けます。
前回気温: (SELECT 気温 FROM 観測テーブルA AS 観測テーブルA_1 WHERE 観測テーブルA_1.観測ID = 観測テーブルA.観測ID - 1)
データシートビューです。
レコードの順番となる連番ではない値が存在する場合
サンプルとしてこのようなテーブルを用います。
日付型の「日付」列をレコードの順番として用います。値が連番ではなく途切れ途切れなので、ちょっと工夫が必要です。
DLookUp関数を用いる例
わかりやすさ優先で2段階のクエリを設けます。最初のクエリではレコードに連番を振り、次のクエリで最初の例と同じように「1つ前」の値を求めます。
まず最初のクエリ(名前は「観測クエリB1_1」)で次のような列を設けます。
順番: DCount("日付","観測テーブルB","日付 < #" & [日付] & "#")+1
この列は、そのレコードの日付より前の日付がいくつあるか数えて1を足していますので、結果的に連番となります。
なお、日付型の値を比較する際の「#」の存在に注意してください。
データシートビューです。
こうなるとあとは最初の例と同じです。このクエリに基づく新しいクエリ(名前は「観測クエリB1_2」)をつくり、次のような列を設けます。
前回気温: DLookUp("気温","観測クエリB1_1","順番 = " & [順番]-1)
データシートビューです。
サブクエリを用いる例
SQLで求めます。せっかくですのでクエリが1個で済むような内容とします(順番の算出が省略されます)。
次のような列を設けます。
前回気温: (SELECT 気温 FROM 観測テーブルB AS 観測テーブルB_1 WHERE 観測テーブルB_1.日付 = (SELECT Max(日付) FROM 観測テーブルB AS 観測テーブルB_2 WHERE 観測テーブルB_2.日付 < 観測テーブルB.日付))
データシートビューです。