2 對上一年資料的變數 SQL 查詢

2 對上一年資料的變數 SQL 查詢

擁有一個表,其中的 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最大值。yearnameyearyear(date())

然後,該查詢的結果與原始表進行內連接,以便aptdate為每個name& 最大值選擇相應的值year。這形成了子查詢q2

最後,原表為左邊連接到子查詢q2(如果給定名稱沒有上一年的記錄),結果由父查詢輸出。

相關內容