Sql 在特定日期之前提取最后一条记录
我有两张桌子。表1列出了员工请病假的时间和日期 表1: 受雇者 打电话的日期 A. 1/1/2020 B 2/5/2020 A. 8/2/2020 B 12/20/2020 您可以这样做: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
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);