У меня есть пара столов, и мне нужно к ним присоединиться, но с изюминкой.
Таблица #GradeChange содержит идентификаторы учащихся, дату вступления в силу изменения оценки и оценку, которую они изменили на ПО в эту дату. В таблице #EventOccurrence есть события, которые произошли для этого учащегося в определенную дату. Мне нужно выяснить, в каком классе учился студент, когда произошло событие. Это будет самая последняя оценка от #GradeChange, которая произошла до даты вступления в силу #EventOccurrence. У студентов может быть несколько EventOccurrence, и мы можем предположить, что у всех студентов будет хотя бы одна запись #GradeChange с датой, предшествующей их самому старому событию.
Это DDL:
/* If the test table already exists, drop it */
IF OBJECT_ID('TempDB..#GradeChange','U') IS NOT NULL
DROP TABLE #GradeChange;
IF OBJECT_ID('TempDB..#EventOccurrence','U') IS NOT NULL
DROP TABLE #EventOccurrence;
/* Create first temp table */
CREATE TABLE #GradeChange
(
ID varchar(6),
EffectiveDate datetime,
Grade varchar(50)
);
/* Populate it */
INSERT INTO #GradeChange
(ID, EffectiveDate, Grade)
SELECT '678443','Jul 2 2009 11:30PM','Grade 3' UNION ALL
SELECT '678443','Jan 24 2007 2:40PM','Kindergarten - Half Day' UNION ALL
SELECT '678443','Jul 4 2007 11:09PM','Grade 1' UNION ALL
SELECT '678443','Jul 2 2008 11:35PM','Grade 2' UNION ALL
SELECT '718466','May 18 2009 11:50PM','Pre-Kindergarten' UNION ALL
SELECT '718466','Jul 2 2009 11:27PM','Kindergarten - Half Day' UNION ALL
SELECT '718466','Aug 27 2009 11:18PM','Pre-Kindergarten' UNION ALL
SELECT '718466','Jul 9 2010 11:18PM','Kindergarten - Half Day' UNION ALL
SELECT '718466','Aug 2 2010 11:14PM','Kindergarten';
/* Create 2nd temp table */
CREATE TABLE #EventOccurrence
(
ID varchar(6),
EventDate datetime
);
/* Populate it */
INSERT INTO #EventOccurrence
(ID, EventDate)
SELECT '718466','Nov 16 2010 12:00AM' UNION ALL
SELECT '718466','May 20 2009 12:00AM' UNION ALL
SELECT '678443','Dec 7 2007 12:00AM';
Итак, две таблицы будут выглядеть так:
![Tables Example](https://i.stack.imgur.com/PI7o7.gif)
И ожидаемые результаты будут выглядеть так:
![Results Example](https://i.stack.imgur.com/4cpKU.gif)
Я играл с "MAX", "MIN" и "OVER ()", но не совсем правильно понял. Я очень ценю любую помощь!