2017-02-13 31 views
0

Я пытаюсь создать какие-то поля Validity (Date Range) в моей таблице MS ACCESS. Группе по идентификатору, теме и уровню необходимо будет определить период действия каждой записи. Если не будет проведено соответствующего теста для улучшения оценки, действующая до настоящего времени будет установлена ​​на 31/12/9999.SQL Server LEAD Эквивалентная функция в MS Access 2016

У меня есть следующая таблица в настоящее время:

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, есть ли другой способ добиться тех же результатов?

+0

Почему бы не сохранить точный запрос SQL Server с использованием запроса доступа MS Access? Кроме того, здесь нет VBA. – Parfait

ответ

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]; 
+0

это возвращает ошибку «вы написали подзапрос, который может возвращать более одного поля без использования зарезервированного слова EXISTS в предложении FROM основного запроса. Пересмотрите инструкцию SELECT подзапроса, чтобы запросить только одно поле». – user1688194

+0

@ user1688194. , , К сожалению, это должно быть 'MIN (TestDate)'. –

+0

теперь запрос возвращает код ошибки. «Ваш запрос не включает указанное выражение« TestDate »как часть функции агрегации. – user1688194