根据最接近的数字列连接两个表

时间:2017-09-14 11:45:08

标签: sql sql-server join

我有这样的表A

id |stuff| p_year | profit
---|-----|--------|-------
1  | 1   | 2000   | 12
1  | 2   | 2005   | 15
2  | 1   | 2002   | 14
2  | 2   | 2001   | 16

和表格B是这样的:

stuff|p_year| category
-----|------|---------
1    | 2001 | 1
1    | 2008 | 2
2    | 2002 | 1
2    | 2009 | 2

现在,我想基于stuff列以及表p_year的最大A小于表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查询执行此操作?

2 个答案:

答案 0 :(得分:2)

您的问题非常适合横向连接。但是,并非所有数据库都支持此类连接。

如果没有,你可以定期加入:

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;

答案 1 :(得分:1)

我不知道这是否有效。但这将是我的第一次尝试。

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

当然你必须调整它;)