一个表中的SQL Count日期发生在另一表的开始日期和结束日期之间

时间:2019-03-20 10:41:15

标签: mysql sql

我有一个表“ tb1 ”,如下所示:

Nurse    Start          End        Posting 
---    ------------   -----------  -------
123    2012-04-26     2014-02-10   ABC
123    2015-03-21     2016-01-12   DEF
123    2016-05-19     2018-09-14   MNO
256    2017-01-15     2018-02-20   JKL
256    2018-07-13     2019-01-17   MNO

以及另一个单独的表“ tb2 ”,可以通过护士列将其链接到上表。

Nurse    PartyDate 
---    ------------  
123    2017-02-23     
123    2017-05-11     
256    2018-11-28

我想计数,每个护士在每个帖子的开始和结束日期之间参加的聚会数量。预期结果应如下所示:

Nurse    Start          End        Posting   Count
---    ------------   -----------  -------   ------
123    2012-04-26     2014-02-10    ABC        0
123    2015-03-21     2016-01-12    DEF        0
123    2016-05-19     2018-09-14    MNO        2
256    2017-01-15     2018-02-20    JKL        0
256    2018-07-13     2019-01-17    MNO        1

2 个答案:

答案 0 :(得分:2)

一种方法是相关子查询:

select t1.*,
       (select count(*)
        from tb2 t2
        where t2.nurse = t1.nurse and
              t2.partydate >= t1.start and
              t2.partydate <= t1.end
       ) as num_parties
from tb1 t1;

为了提高性能,您希望在tb2(nurse, start, end)上建立索引。

答案 1 :(得分:0)

这是实现这一目标的另一种方式。

buildscript {
    configurations {
        all*.exclude group: 'com.google.firebase', module: 'firebase-core'
        all*.exclude group: 'com.google.firebase', module: 'firebase-iid'
    }
    repositories {
        ...
    }
    dependencies {
        ...
    }
}

预计它会比相关查询运行得更快,因为对于后者,来自tb1数据库引擎的每个记录都必须扫描tb2表