擁有一個表,其中的 ID 在建立記錄時分配給記錄。
擁有多年的記錄(有時會跳過年份,因此可能有:2019 年、2017 年、2016 年等...)。
記錄包括作為文字的年份欄位和作為文字的名稱欄位(此名稱欄位在各個年份都是相同的)以及作為日期的 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,因為該名稱可能沒有更早的記錄)。
似乎無法破解這個難題 - 非常感謝任何幫助。
感謝您的有用回覆 - 我很快就會對其進行測試。
同時回答Lee的請求:
範例表如下圖所示:
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(在此處計算之前的日期*)
{但是您想要}
*表達式看起來像這樣:
從表格中選擇 max(PrevAptDate.AptDate為 PrevAptDate,
其中 (PrevAptDate.AptDate < Table.AptDate)
和
(PrevAptDate.Name = Table.Name)
這都是即興的,但它應該很接近並讓你指向正確的方向。我希望它有幫助。
答案2
假設我已經正確理解您的設定和要求,以下是使用聯結而不是相關子查詢的一種可能方法:
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
最大值。year
name
year
year(date())
然後,該查詢的結果與原始表進行內連接,以便aptdate
為每個name
& 最大值選擇相應的值year
。這形成了子查詢q2
。
最後,原表為左邊連接到子查詢q2
(如果給定名稱沒有上一年的記錄),結果由父查詢輸出。