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(某些“以前”年份可能为空,因为可能没有此名称的更早记录)。

似乎无法解决这个问题 - 非常感谢任何帮助。


感谢您的有益答复 - 我很快就会对它们进行测试。

同时回答李先生的请求:

样表如下:

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(如果给定名称没有前一年的记录),结果由父查询输出。

相关内容