0

在我们的数据库中,有一份学生在其一生中就读的学校列表。我在下面附上了一张照片,以展示它在裁剪机密信息时的结构。

在此处输入图像描述

我已经有了一个主数据集,其中需要包含特定信息,并且“历史学校名称”需要在另一个数据集中。

因此,我需要做一个查找功能将历史学校名称带入报告中:“=lookup(Fields!Child_ID__System_Ref_.Value, Fields!Child_ID__System_Ref_.Value, Fields!School_Details_Name.Value, "Attendance_Data")"

问题在于它会以不合逻辑的顺序将任何随机学校带入。我需要他们在现在就读的学校之前上过的最新学校。我不知道该怎么做,因为没有身份证号或任何东西。

我能想到的唯一方法是使用他们上学的日期,并在他们开始新学校之前做一个表达。他们目前就读的学校没有“结束日期”。

4

1 回答 1

1

如果可能,我会直接在您的数据集查询中执行此操作。

我根据您的样本模拟了一些样本数据(并添加了另一个孩子)

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

这将给出这个结果。

在此处输入图像描述

于 2021-12-09T14:35:23.827 回答