小编典典

如何使用日期范围联接表而无需执行任何步骤

sql

我有两个表,我们称它们为表A和B:-

表A看起来像这样:

   A.Num1       |   A.Num2      |   A.Date      
   12345        |   38170       |   28/05/2013      
   12345        |   38170       |   29/05/2013      
   12345        |   38170       |   31/05/2013      
   12345        |   38170       |   01/06/2013      
   12345        |   38170       |   03/06/2013      
   12345        |   38170       |   04/06/2013  
   12345        |   38170       |   04/06/2013          
   12345        |   38170       |   07/06/2013

表2(B)看起来像这样:

    B.Num1      |   B.Num2      |   B.Status    |   B.Date
    12345       |   38170       |   New         |   28/05/2013  
    12345       |   38170       |   Closed      |   31/05/2013  
    12345       |   38170       |   Reopened    |   04/06/2013

我需要一个像这样的表作为输出-它应该基本上包含表A的所有行+表B的状态

    Num1        |   Num2        |   Status      |   Date
    12345       |   38170       |   New         |   28/05/2013      
    12345       |   38170       |   New         |   29/05/2013      
    12345       |   38170       |   Closed      |   31/05/2013      
    12345       |   38170       |   Closed      |   01/06/2013      
    12345       |   38170       |   Closed      |   03/06/2013      
    12345       |   38170       |   Reopened    |   04/06/2013  
    12345       |   38170       |   Reopened    |   04/06/2013      
    12345       |   38170       |   Reopened    |   07/06/2013

另外,最好通过简单的SQL语句,而不是过程。

提前致谢。如有任何澄清,请发表评论

因杜鲁

更新

当表B中的两行状态更改但在同一日期时,联接中的值不一致。

举个例子:

我有两个表,分别是A和B。它们是非常大的表,并且它们记录某些信息。表A通过每隔几天扫描一次数据来记录文件,但缺少状态列。如果有更改,则表B将获得一个带有状态列的新条目。我需要将两者匹配,并为表A中与B对应的每个条目派生一个状态。

表B

Id  | Num1  | Num2  | CreatedOn   | Status
100 | 12345 | 38170 | 28/05/2013  | New
150 | 12345 | 38170 | 28/05/2013  | Closed
200 | 12345 | 38170 | 31/05/2013  | Reopened
250 | 12345 | 38170 | 04/06/2013  | Closed

表A

Id  | Num1  | Num2  | CreatedOn
55  | 12345 | 38170 | 28/05/2013
99  | 12345 | 38170 | 30/05/2013
145 | 12345 | 38170 | 31/05/2013
192 | 12345 | 38170 | 31/05/2013
223 | 12345 | 38170 | 04/06/2013

期望的输出

Id  | Num1  | Num2  | CreatedOn   | Status
55  | 11552 | 38170 | 28/05/2013  | New
99  | 11552 | 38170 | 30/05/2013  | Closed
145 | 11552 | 38170 | 31/05/2013  | Reopened
192 | 11552 | 38170 | 31/05/2013  | Reopened
223 | 11552 | 38170 | 04/06/2013  | Closed

相反,我得到了:(使用Jeffrey Kamp的回复)

Id  | Num1  | Num2  | CreatedOn   | Status
55  | 11552 | 38170 | 28/05/2013  | Closed
99  | 11552 | 38170 | 30/05/2013  | Closed
145 | 11552 | 38170 | 31/05/2013  | Reopened
192 | 11552 | 38170 | 31/05/2013  | Reopened
223 | 11552 | 38170 | 04/06/2013  | Closed

这:(使用回复2-马克·班尼斯特)

Id  | Num1  | Num2  | CreatedOn   | Status
55  | 11552 | 38170 | 28/05/2013  | New
99  | 11552 | 38170 | 30/05/2013  | New
145 | 11552 | 38170 | 31/05/2013  | Reopened
192 | 11552 | 38170 | 31/05/2013  | Reopened
223 | 11552 | 38170 | 04/06/2013  | Closed

显然,记录Id-55可以是New或Closed,因为表B在同一天(2013年5月28日)有两个条目。但是逻辑是它从New-> Closed->
Reopened开始,所以有这样的方式?


阅读 174

收藏
2021-04-28

共1个答案

小编典典

对于初学者来说有些简单化:

SELECT A.Num1
      ,A.Num2
      ,NVL(
         (SELECT DISTINCT
                 FIRST_VALUE(B.Status)
                 OVER (ORDER BY B.Date DESC)
          FROM   B
          WHERE  B.Num1 = A.Num1
          AND    B.Num2 = A.Num2
          AND    B.Date <= A.Date
         ),'New') AS Status
      ,A.Date
FROM A;

也许有更好的方法可能会更快地工作。

2021-04-28