【问题标题】:SQL Server LEAD Equivalent Function in MS Access 2016MS Access 2016 中的 SQL Server LEAD 等效函数
【发布时间】:2017-06-30 23:09:41
【问题描述】:

我正在尝试在我的 MS ACCESS 表上创建某种有效性(日期范围)字段。它需要按 ID、主题和级别分组,以得出每条记录的有效期。如果没有进行相应的考试以提高成绩,则有效日期将设置为 9999 年 12 月 31 日。

我现在有下表:

ID  | Subject | Level | FromGrade | ToGrade | TestDate
101 | Math    |  5    | C+        | D       | 31/11/2016
101 | Math    |  4    | D         | A       | 01/12/2016
101 | Math    |  5    | D         | B+      | 12/12/2016
101 | Math    |  5    | B+        | A       | 25/12/2016
102 | English |  4    | B         | B       | 20/12/2016
102 | English |  4    | B         | C       | 28/12/2016

最终结果表我应该得到以下结果:

ID  | Subject | Level | FromGrade | ToGrade | TestDate   | EffectiveTo
101 | Math    |  5    | C+        | D       | 31/11/2016 | 11/12/2016
101 | Math    |  4    | D         | A       | 01/12/2016 | 31/12/9999
101 | Math    |  5    | D         | B+      | 12/12/2016 | 24/12/2016
101 | Math    |  5    | B+        | A       | 25/12/2016 | 31/12/9999
102 | English |  4    | B         | B       | 20/12/2016 | 27/12/2016
102 | English |  4    | B         | C       | 28/12/2016 | 31/12/9999

要在 SQL Server 中执行此操作,我可以轻松使用 LEAD OVER 函数:

SELECT [ID]
, [Subject]
, [Level]
, [FromGrade]
, [ToGrade]
, [TestDate]
, [EffectiveTo] = LEAD([TestDate], 1) OVER ( PARTITION BY [ID], [Subject], [Level]  ORDER BY [TestDate] )
into StudentTable2
FROM [dbo].[StudentTable1]
ORDER BY [ID], [Subject], [Level], [TestDate]

然后跟一个

update [dbo].StudentTable2set [EffectiveTo] = DATEADD("DAY", -1, [EffectiveTo]) where EffectiveTo is not null

但是,这不适用于 Ms Access/VBA 脚本,有没有其他方法可以达到相同的结果?

【问题讨论】:

  • 为什么不使用 MS Access 直通查询保留准确的 SQL Server 查询?另外,这里没有 VBA。

标签: sql ms-access vba ms-access-2016


【解决方案1】:

您可以使用相关子查询。在 MS Access 中获取下一个值:

SELECT st.*,
       (SELECT MIN(st2.TestDate)
        FROM dbo.StudentTable1 as st2
        WHERE st2.ID = st.ID AND
              st2.Subject = st.Subject AND
              st2.[Level] = st.[Level] AND
              st2.TestDate > st.TestDate
       ) as EffectiveTo
FROM dbo.StudentTable1 as st
ORDER BY [ID], [Subject], [Level], [TestDate];

【讨论】:

  • this返回错误“你编写了一个子查询,可以返回多个字段,而无需在主查询的FROM子句中使用EXISTS保留字。修改子查询的SELECT语句只请求一个字段. "
  • @user1688194 。 . .糟糕,应该是MIN(TestDate)
  • 现在查询返回错误代码“您的查询不包括指定的表达式 'TestDate' 作为聚合函数的一部分。
  • @user1688194 j。 . .但这是MIN()的论据。
  • 这是一个奇怪的错误,除非 OP 没有像您发布的那样运行查询。请注意 Level 是 Access 中的 reserved word,这可能会导致奇怪的错误。尝试用方括号转义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 2020-09-11
相关资源
最近更新 更多