Sql 在特定日期之前提取最后一条记录

Sql 在特定日期之前提取最后一条记录,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有两张桌子。表1列出了员工请病假的时间和日期 表1: 受雇者 打电话的日期 A. 1/1/2020 B 2/5/2020 A. 8/2/2020 B 12/20/2020 您可以这样做: SELECT Employee, DateCalled, ( SELECT TOP 1 Location FROM table2 WHERE DateArrived <= t1.D

我有两张桌子。表1列出了员工请病假的时间和日期

表1:

受雇者 打电话的日期 A. 1/1/2020 B 2/5/2020 A. 8/2/2020 B 12/20/2020 您可以这样做:

SELECT Employee,
       DateCalled,
       (
           SELECT TOP 1
               Location
           FROM table2
           WHERE DateArrived <= t1.DateCalled
                 AND Employee = t1.Employee
           ORDER BY DateArrived DESC
       ) Location
FROM table1 t1;

一种简单的方法是使用lead和left join:


请注意,这种结构便于将表2中的其他列添加到结果集中。

根据问题指南,请说明您尝试了什么,并告诉我们您在本网站或其他地方发现了什么,以及为什么它不满足您的需要。老实说,我试图在脑海中描绘出逻辑,但不知道从哪里开始。首先,写一个查询,列出生病日期之前的所有到达日期和地点。然后把它贴在这里。这是工作的一半。另外,请发布特定的SQL Server版本选择@@version如果您不知道从何处开始,则必须推荐一个教程。请阅读以获取有关改进问题的提示。不要让我们猜测日期列是date还是nvarcharmax,请共享您的DDL。
SELECT t.Employee,
       t.DateCalled,
       t.Location
FROM
(
    SELECT t1.Employee,
           t1.DateCalled,
           t2.Location,
           ROW_NUMBER() OVER (PARTITION BY t1.Employee,
                                           t1.DateCalled
                              ORDER BY t2.DateArrived DESC
                             ) rw
    FROM table1 t1
        LEFT JOIN table2 t2
            ON t2.Employee = t1.Employee
               AND t2.DateArrived <= t1.DateCalled
) t
WHERE t.rw = 1;
select t1.*, t2.location
from table1 t1 left join
     (select t2.*, lead(date_arrived) as next_date_arrived
      from table2 t2
     ) t2
     on t1.employee = t2.employee and
        t1.date_called >= t2.date_arrived and
        (t1.date_called < t2.date_arrived or t2.date_arrived is null);