2 前年のデータに対する変数SQLクエリ

2 前年のデータに対する変数SQLクエリ

レコードが作成されるたびに、レコードに ID が割り当てられたテーブルを作成します。

複数年の記録があります (年がスキップされる場合があるため、2019、2017、2016 などになります)。

レコードには、テキストとしての Year フィールドとテキストとしての Name フィールド (この Name フィールドは年を通じて同一)、および日付としての AptDate フィールドが含まれます。

Access SQL クエリを使用して以下を表示したい:

名前、現在の年、現在の年の AptDate、'前の' 年の AptDate (名前は同一で、年は次に最近の年になります)

SQL でここまで来ました (EnteredSampleName の「前年」の AptDate を表示します):

SELECT Table.AptDate
FROM Table
WHERE (((Table.Name)=[EnteredSampleName]) AND ((Year=(SELECT Max(Table.Year) AS LastYear
FROM Table
WHERE (((Table.Year)<(SELECT MAX(Table.Year) FROM Table WHERE ((Table.Name)=[EnteredSampleName]))))))));

EnteredSampleName を削除し、すべてのレコードに対してこの「以前の」AptDate を表示したいと思います (この名前の以前のレコードが存在しない可能性があるため、一部の「以前の」年は Null になる可能性があります)。

この問題を解決することはできないようです。どなたか助けていただければ幸いです。


役に立つご返信をありがとうございます。すぐにテストしてみます。

とりあえず、リーの要望に答えると:

サンプル テーブルは次のようになります。

ID  Name    Year    AptDate
1   A   2015    2015-02-02
2   B   2015    2015-03-05
3   C   2017    2017-04-04
4   B   2017    2017-06-09
5   C   2018    2018-07-03
6   A   2018    2018-09-10
7   A   2019    2019-01-08
8   D   2019    2019-01-09

クエリ結果の目標:

Name    Year    AptDate AptDatePrevious
A   2019    2019-01-08  2018-09-10
B   2017    2017-06-09  2015-03-05
C   2018    2018-07-03  2017-04-04
D   2019    2019-01-09  

予想どおり、D には AptDatePrevious がありません。これで明確になったと思います。ありがとうございます。

答え1

この MS サイトの番号付きの例が、正しい方向を指し示している可能性があります。
https://support.office.com/en-us/article/nest-a-query-inside-another-query-or-in-an-expression-by-using-a-subquery-a8532322-e42f-4f94-bc38-ace7c182916a

必要な作業は次のようになります。

Table.Name、Table.Year、Table.AptDate、expr(ここで前の日付を計算*)を
Table
Order by {任意の方法}から選択します

*表現は次のようになります:


テーブルから PrevAptDate.AptDate を PrevAptDate として選択します
(PrevAptDate.AptDate < Table.AptDate) かつ
(
PrevAptDate.Name = Table.Name)

これはすべて思いつきですが、近いものであり、正しい方向を指し示すものになるはずです。お役に立てば幸いです。

答え2

セットアップと要件を正しく理解していると仮定すると、相関サブクエリではなく結合を使用する 1 つの方法を以下に示します。

select t0.name, t0.year, t0.aptdate, q2.aptdate
from YourTable t0 left join
(
    select t1.name, t1.aptdate
    from YourTable t1 inner join
    (
        select t2.name, max(t2.year) as lastyear
        from YourTable t2
        where t2.year < year(date())
        group by t2.name
    ) q1 on
    t1.name = q1.name and 
    t1.year = q1.lastyear
) q2 on 
t0.name = q2.name
where t0.year = year(date())

上記のクエリで、 のすべての出現をYourTableテーブルの名前に置き換えます。

ここで、最も内側のクエリは、が現在の年 より小さい各 のq2最大値を取得します。yearnameyearyear(date())

aptdateこのクエリの結果は、それぞれに対応するname最大値を選択するために、元のテーブルと内部結合されますyear。これにより、サブクエリが形成されますq2

最後に、元の表はサブクエリに結合されq2(指定された名前の前年のレコードがない場合)、結果は親クエリによって出力されます。

関連情報