在创建记录时,有一个带有指定 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
最大值。year
name
year
year(date())
然后将此查询的结果与原始表进行内连接,以便aptdate
为每个查询选择相应的name
最大值year
。这形成了子查询q2
。
最后,原始表格为左边连接到子查询q2
(如果给定名称没有前一年的记录),结果由父查询输出。