Sql 根据数字最接近的列联接两个表
我有一张这样的桌子:Sql 根据数字最接近的列联接两个表,sql,sql-server,join,Sql,Sql Server,Join,我有一张这样的桌子: id |stuff| p_year | profit ---|-----|--------|------- 1 | 1 | 2000 | 12 1 | 2 | 2005 | 15 2 | 1 | 2002 | 14 2 | 2 | 2001 | 16 stuff|p_year| category -----|------|--------- 1 | 2001 | 1 1 | 2008 | 2 2 | 2002 |
id |stuff| p_year | profit
---|-----|--------|-------
1 | 1 | 2000 | 12
1 | 2 | 2005 | 15
2 | 1 | 2002 | 14
2 | 2 | 2001 | 16
stuff|p_year| category
-----|------|---------
1 | 2001 | 1
1 | 2008 | 2
2 | 2002 | 1
2 | 2009 | 2
表B是这样的:
id |stuff| p_year | profit
---|-----|--------|-------
1 | 1 | 2000 | 12
1 | 2 | 2005 | 15
2 | 1 | 2002 | 14
2 | 2 | 2001 | 16
stuff|p_year| category
-----|------|---------
1 | 2001 | 1
1 | 2008 | 2
2 | 2002 | 1
2 | 2009 | 2
现在,我想根据stuff列连接这些表,表A的最大p_年小于表B
例如,加入后,我们有:
id|stuff|p_year_A|p_year_B|category|profit
--|-----|--------|--------|--------|------
1 | 1 | 2000 |2001 | 1 | 12
1 | 2 | 2005 | 2009 | 2 | 15
2 | 1 | 2002 | 2008 | 2 | 14
2 | 2 | 2001 | 2002 | 1 | 16
如何使用sql查询实现这一点?您的问题非常适合横向联接。但是,并非所有数据库都支持这种连接 如果没有,则可以使用常规联接:
select a.*, b.*
from a join
b
on a.stuff = b.stuff
where b.year = (select max(b2.year)
from b
where b2.stuff = a.stuff and b2.year < a.year
);
在SQL Server中,您将执行以下操作:
select a.*, b.*
from a outer apply
(select top 1 b.*
from b
where b.stuff = a.stuff and b.year < a.year
order by b.year desc
) b;
我不知道这是否有效。但那将是我的第一次尝试 除非p_year_B总是比p_year_A大
SELECT * FROM A, B WHERE p_year_B=(SELECT p_year_B FROM B WHERE p_year_A < p_year_B ORDER BY p_year_B DESC LIMIT 1);
当然,你必须调整它 用您正在使用的数据库标记您的问题。