MS Access 2016中的SQL Server LEAD等效功能

时间:2017-02-13 03:03:37

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

我正在尝试在MS ACCESS表上创建某种有效性(日期范围)字段。它需要按ID,主题和级别分组才能得出每条记录的有效期。如果没有相应的测试来提高成绩,迄今为止的有效期将设定为99/12/9999。

我现在有下表:

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 / VBA Ms脚本,有没有其他方法可以实现相同的结果?

1 个答案:

答案 0 :(得分: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];
相关问题