如果可能,我会直接在您的数据集查询中执行此操作。
我根据您的样本模拟了一些样本数据(并添加了另一个孩子)
DECLARE @t TABLE (ChildID int, SchoolID int, StartDate date, EndDate Date)
INSERT INTO @t VALUES
(1, 10, '2011-07-18', '2011-09-07'),
(1, 20, '2011-09-08', '2019-07-19'),
(1, 30, '2019-09-02', '2021-11-30'),
(1, 40, '2021-12-01', NULL),
(2, 20, '2012-07-18', '2012-09-07'),
(2, 40, '2012-09-08', '2018-07-19'),
(2, 60, '2018-09-02', '2020-11-30'),
(2, 80, '2020-12-01', NULL)
SELECT
*
, LAG(SchoolID, 1, NULL) OVER(PARTITION BY ChildID ORDER BY StartDate) AS PreviousSchoolID
FROM @t t
然后我就简单的用LAG()
函数来获取以前的学校。这给出了以下结果
如果您只需要当前和以前的学校,那么您可以将最终选择语句包装为子查询,然后仅选择没有 EndDate 的行
SELECT * FROM (
SELECT
*
, LAG(SchoolID, 1, NULL) OVER(PARTITION BY ChildID ORDER BY StartDate) AS PreviousSchoolID
FROM @t t
) h WHERE EndDate IS NULL
这将给出这个结果。