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);

当然,你必须调整它

用您正在使用的数据库标记您的问题。