SQL获取其他表中某个日期的最近行

SQL获取其他表中某个日期的最近行,sql,sql-server,Sql,Sql Server,有一个表选项卡a: 例如,另一个表选项卡中的这条记录: 我需要获取与TAB_B.Date字段最近的TAB_A.Value,在本例中,该字段应为“101000003”,而不是“101000006” 我一直在寻找类似场景的其他响应,例如,但这并不是我所需要的 有什么建议吗?提前感谢你的帮助 编辑:我忘了提到TAB_A有超过20万条记录,TAB_B有超过5500万条记录 SELECT ID, Date, Value FROM TAB_A WHERE Date < (SELECT Date f

有一个表选项卡a:

例如,另一个表选项卡中的这条记录:

我需要获取与TAB_B.Date字段最近的TAB_A.Value,在本例中,该字段应为“101000003”,而不是“101000006”

我一直在寻找类似场景的其他响应,例如,但这并不是我所需要的

有什么建议吗?提前感谢你的帮助

编辑:我忘了提到TAB_A有超过20万条记录,TAB_B有超过5500万条记录

SELECT ID, Date, Value 
FROM TAB_A 
WHERE Date < (SELECT Date from TAB_B where ID=40002) 
ORDER BY Date DESC LIMIT 1

首先,从子查询的选项卡B中选择所需的日期。然后,您可以从选项卡B中选择所有早于此的日期,您可以将其修改为。以下代码将显示给定条件的第一条记录。在您的情况下,它将返回您所需的


您应该在选项卡a中有一个日期索引,以便在SQLServer2008+中正常运行:

declare @tab_a table(id int, Date date, value int)
insert @tab_a values (101,'2014-03-01',101000001),
(101,'2014-03-03',101000003),(101,'2014-03-06',101000006),
(102,'2014-03-01',102000001),(103,'2014-03-01',103000001)

declare @tab_b table(id int, Date date, tab_a_id int)
insert @tab_b
values
(  40002, '2014-03-05', 101 ), (  40002, '2014-03-02', 101 )

select b.ID, b.Date bdate, x.Date adate, x.value
from @tab_b b
outer apply
(select top 1 value, date
from @tab_a a
where a.date <= b.date
and a.id = b.TAB_A_Id
order by a.date desc
) x
试试这个:

SELECT TOP 1 * FROM (
SELECT A.ID,A.Value, MIN(DATEDIFF(day,A.Date,B.Date)) as MinDiff
FROM TAB_A A, TAB_B B
GROUP BY A.ID,A.Value ) as T 
WHERE MinDiff>0
ORDER BY MinDiff
结果:

ID    bdate       adate     value
40002 2014-03-05 2014-03-03 101000003
40002 2014-03-02 2014-03-01 101000001
ID    VALUE       MINDIFF
101   101000003   2
请参阅中的结果

说明:


内部查询将选择ID、值和最小日期差。通过外部查询,我们可以选择最小日期差大于0的记录。

由于标记是sql server,限制将不起作用。相反,使用top

 SELECT TOP 1 ID, Date, Value 
 FROM TAB_A 
 WHERE Date < (SELECT Date from TAB_B where ID=40002) 
 ORDER BY Date DESC

请原谅我的大写字母/小写字母不一致…

限制在sql Server中无效在sql Server中我将使用SELECT TOP 1+1对于您,您的选择将执行非常缓慢。这将导致这些表的输出或内存不足。对于表b中2014-03-02的日期,您的期望值是多少?你有索引吗?对于所有这些行,我希望您有一些我们可以在回答中使用的索引预期的TAB_B'2014-03-02'的值将为101000001,因为它是该ID的最新-过去值。此表还没有任何索引,但我计划为其中一个添加一些日期字段声明,很明显,但2014-03-01有3个不同的值。这两个表之间没有匹配的id哦,是的,你是对的。对不起,我试图简化这个表,它实际上比那个表复杂得多。我应该在TAB_B中包含一个“TAB_a.Id”字段。这肯定回答了我关于单个查询的问题。我想知道如何连接这两个表,以便获得一个TAB_B.Id、TAB_B.Date、TAB_a.Value模式。谢谢user1261104。它抛出一个错误:子查询返回的值超过1。当子查询在=、!=、=或者当子查询用作表达式时。就像在另一个查询中一样,如果希望它只返回一行,请使用Distict,因此第4行变成WHERE Date