繁体   English   中英

SQL从一个表中查询所有日期范围,而不是在另一个表的任何日期范围之间为给定外键

[英]SQL querying all date ranges from one table not between any date ranges of another for given foreign key

虽然我检查了其他关于重叠日期范围的帖子,但我还没有找到解决这个问题的帖子。

我有两个表,一个用于成员的 Attribute_spans 历史记录

MEMBERCODE |   START_DATE   |   END_DATE    | ATTRIBUTE

423223     |   10/01/2020   |  12/31/9999   | Dual
423223     |   11/01/2020   |  11/30/2020   | Cost Share

然后是每个成员的成员资格或“注册跨度”历史记录的另一个表。

MEMBERCODE |   EFFECTIVE_DATE |  TERM_DATE  |  PLAN_PRODUCT

423223     |   11/01/2020     |  12/31/9999 |  Foo
423223     |   09/01/2020     |  09/30/2020 |  Bar

成员最新的属性范围应始终在成员最近的注册范围内,但每个注册范围可以有多个属性。

问题是我想从成员的历史中找到所有属性跨度,这些跨度不完全位于他们历史中的任何注册跨度内。
例如对于这个属性跨度:
10/1/2020 12/31/9999 ** 在该成员的任何注册跨度内没有 10/1 期。 它属于间隙期内。

SELECT a.MEMBER_NBR, a.START_DATE, A.END_DATE,B.EFFECTIVE_DATE ,B.TERM_DATE,
A.ATTRIBUTE,B.PLAN_PRODUCT
FROM Attribute_Spans A
JOIN Enrollment_Spans B ON A.MemberCode = B.MemberCode
WHERE ((A.Start_Date NOT BETWEEN B.Effective_Date and B.End_Date) AND (A.End_date NOT BETWEEN 
B.Effective_Date and B.End_Date))
AND A.MemberCode = B.MemberCode

这不起作用,因为它确实找到了不在注册跨度范围内的属性日期范围,但该属性范围确实在该特定成员的另一个注册跨度范围内

我得到什么

MEMBER_CODE | START_DATE | END_DATE   | EFFECTIVE_DATE | TERM_DATE  | ATTRIBUTE | PLAN_PRODUCT
423223      | 10/01/2020 | 12/31/2020 | 09/01/2020     | 09/30/2020 | Dual      | Bar
423223      | 10/01/2020 | 12/31/2020 | 11/01/2020     | 12/31/2020 | Dual      | Foo
423223      | 11/01/2020 | 11/30/2020 | 09/01/2020     | 09/30/2020 | Cost Share| Bar

我的期望

MEMBER_CODE | START_DATE | END_DATE   | EFFECTIVE_DATE | TERM_DATE  | ATTRIBUTE | PLAN_PRODUCT
423223      | 10/01/2020 | 12/31/2020 | 09/01/2020     | 09/30/2020 | Dual      | Bar
423223      | 10/01/2020 | 12/31/2020 | 11/01/2020     | 12/31/2020 | Dual      | Foo

一些用于制作表格的入门代码

CREATE TABLE Attribute_Spans (
MemberCode int,
StartDate date,
EndDate date,
Attribute char(50)
)
INSERT INTO Attribute_Spans (MemberCode,StartDate,EndDate,Attribute)
VALUES (423223,'10/01/2020','12/31/9999','Dual'),
        (423223,'11/01/2020','11/30/2020','Cost Share')

CREATE TABLE Enrollment_Spans (
    MemberCode int,
    Effective_Date date,
    End_Date date,
    PlanProduct char(50)
    )
INSERT INTO Enrollment_Spans (MemberCode,Effective_Date,End_Date,Plan_Product)
VALUES (423223,'09/01/2020','09/30/2020','Foo'),
        (423223,'11/01/2020','12/30/2020','Bar')

使用not exists

select a.*
from attribute_spans a
where not exists (select 1
                  from Enrollment_Spans es
                  where es.membercode = a.membercode and
                        a.end_date > es.effective_date and
                        a.start_date < es.end_date 
                 );

如果一个时间段在另一个时间段之前开始,则两个时间段会重叠。 一个在另一个开始后结束。

这不会将在同一日期结束/开始视为重叠。 如果您希望计数,请将><更改为>=<=

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM