【问题标题】:Count times date occurs between two dates in a second table计数日期出现在第二个表中的两个日期之间
【发布时间】:2020-11-13 08:46:08
【问题描述】:

我有两个表 [Charges] 和 [Defects],并且想要生成 [Desired Query Output],其中当 [Charges].ChargeDate 介于(并包括)[Defects].OpenDate 和 [缺陷].CloseDate。对于 [Defects] 表,NULL 的关闭日期表示它尚未关闭。看起来很简单,但我还没有找到一个很好的例子来说明如何做到这一点。你能帮忙吗??

我使用的是 SQL Server 版本 12。

[收费]

Order  Charge  ChargeDate
1      1.2     07/10/2020
1      0.6     07/15/2020
6      0.002   07/20/2020
8      0.13    07/01/2020
8      1.1     06/18/2020
8      0.3     06/19/2020
10     2.3     06/24/2020

[缺陷]

Order  DefectID  OpenDate     CloseDate
1      25        06/01/2020   NULL
1      27        07/09/2020   07/12/2020
1      30        05/01/2020   07/20/2020
8      45        06/19/2020   06/19/2020
8      47        06/12/2020   07/05/2020
8      48        06/19/2020   NULL
10     49        06/24/2020   NULL

[期望的查询输出]

Order  Charge  ChargeDate   DefectCnt
1      1.2     07/10/2020   3
1      0.6     07/15/2020   2
6      0.002   07/20/2020   0
8      0.13    07/01/2020   2
8      1.1     06/18/2020   1
8      0.3     06/19/2020   3
10     2.3     06/24/2020   1

【问题讨论】:

  • 数据有多大?性能有多重要?
  • 它在 40,860 行上执行。它用于分析报告,因此根据其他不相关的因素,性能可能变得至关重要。不到 1 秒可能没问题。

标签: sql sql-server join sql-server-2012 subquery


【解决方案1】:

您可以使用相关子查询或横向连接:

select 
    c.*, 
    (
        select count(*) 
        from defects d 
        where 
            d.order = c.order 
            and c.ChargeDate >= d.OpenDate
            and (d.CloseDate is null or c.ChargeDate <= d.CloseDate)
    ) as DefectCnt
from charges c

【讨论】:

  • 有效!在 [Charges] = 40860 行和 [Defects] = 1264 行的数据集上大约需要 1 秒
  • 我还查找了横向连接,这也有效。性能差不多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-13
  • 1970-01-01
  • 1970-01-01
  • 2019-07-06
  • 1970-01-01
  • 1970-01-01
  • 2022-12-03
相关资源
最近更新 更多