当前位置: 首页 > 面试题库 >

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

钱嘉致
2023-03-14
问题内容

我有两个表,我们称它们为表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开始,所以有这样的方式?


问题答案:

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

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;

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



 类似资料:
  • 问题内容: 在我的应用程序中,我有一些异步Web服务。服务器接受请求,返回OK响应,并开始使用AsyncTaskExecutor处理请求。我的问题是如何在此处启用请求范围,因为在此处理中,我需要获取由以下内容注释的类: 现在我得到异常: 因为它在SimpleAsyncTaskExecutor而不是在DispatcherServlet 我的请求异步处理 taskExecutor在哪里: 问题答案:

  • 我使用的是jquery数据表。我在做日期范围筛选。当我选择“最小日期”和“最大日期”时,结果是数据表上没有筛选数据。我用了剧本 null null null null 日期格式为YYYY-MM-DD。每次我用日期范围搜索时,结果不会出现在数据表中。请帮帮我,我哪里做错了。谢谢。

  • 我正在尝试使用Node Lambda函数在日期范围之间进行扫描。我正确扫描了数据,但我似乎无法让日期表达式正确工作。 这目前并没有试图在一个范围内返回,它只是现在查看一个日期。我不想在表达式中添加一个和,直到我知道这是可行的。 我的DynamoDB中的示例文档的结构如下: 文档id是我的主键。我对Lamdba和DynamoDB的组合还很陌生,所以我可能把它完全设置错了,但这是我通过研究成功完成的。

  • 我有一个自定义验证器,用来确保在实体保存之前对其应用一些业务规则。 当父(Product)实体被更新(对于save,它工作得很好),以及子实体(列表中的一个或多个ProductPrice)中的一些更改时,它会失败,因为保存列表中ProductPrice的一个实例不知道下一步要保存的ProductPrice的任何信息。 详解: 假设对于给定的,DB中有两个行,如下所示: 假设我希望将作为实体一部分的

  • 问题内容: 我需要限制用户可以从中选择什么。 我似乎无法弄清楚如何限制分钟数,因此他们无法选择过去的日期。 如果我不能这样做,是否还有其他小部件可以让我具有这种灵活性? 问题答案: 根据我收到的建议,以下是我想出的方法:将可选日期限制为仅当日和之后。这适用于GWT 2.1.1 为了完整起见,以下是处理日期的辅助方法:

  • 我正在与一个带有日期范围的雪花数据库左联接查询作斗争。请在下面找到样表内容 我的雪花SQL查询:选择o.ORDER_DATE,大小写当ORDER_DATE为NULL时,则“no”否则“yes”结束为ORDER_PLACED,C.customer_id,C.name FROM CUSTOMER C左联接C.customer_id=o.customer_id和o.ORDER_DATE>=DATEADD