需要帮助在两个日期范围之间选择记录吗?

huangapple go评论44阅读模式
英文:

Need help selecting a record between two date ranges?

问题

我尝试在两个日期范围之间选择记录,但当两个日期范围重叠时,我一直得到重复的记录,如下所示。

以下是一个示例。

保单信息

保单号	保单生效日期	保单终止日期	年度
001		2018-10-01		2019-10-01		2018
002		2019-10-01		2020-10-01		2019
003		2020-10-01		2021-10-01		2020
004		2021-10-01		2022-10-01		2022

保单限制

限制ID	生效日期	终止日期	限额
1		2018-10-01	2021-10-01	1000
2		2018-10-01	3000-01-01	2500

如何选择限制ID:1,对于“保单号:001、002、003”或年度“2018、2019、2020”,对于任何保单生效日期大于2021-01-01的情况,请使用限制ID = 2。

我尝试了以下方法,但它一直创建重复项

((limit.effective_from_date < policy.effective_to_date
  AND limit.effective_to_date > policy.effective_from_date
  )
  OR 
  
  (limit.effective_from_date = policy.effective_from_date 
  AND limit.effective_to_date = CONVERT(datetime, '01/01/3000', 102)))

但上述条件会创建重复项。有没有一种有效的方法来选择在重叠日期范围内的记录。

任何帮助将不胜感激!

英文:

I was trying to select a record between two date ranges but I keep getting duplicate record when two date range overlaps as shown below.

Here is an example.

Policy Info

Policy #	Policy Effective Date	Policy termination date	 Year
001			2018-10-01				2019-10-01				 2018
002			2019-10-01				2020-10-01				 2019
003			2020-10-01				2021-10-01				 2020
004			2021-10-01				2022-10-01				 2022

Policy Limit

LimitID	  Effective Date	Termination Date	Limit
1	      2018-10-01		2021-10-01			 1000
2	      2018-10-01		3000-01-01			 2500

How can I select Limit ID: 1 for Policy #: 001,002 003 or for the years 2018, 2019, 2020 and for any policy effective date greater than 2021-01-01 use Limit ID = 2

I tried the following but it keeps creating dupicate

((limit.effective_from_date &lt; policy.effective_to_date
  AND limit.effective_to_date &gt; policy.effective_from_date
  )
  OR 
  
  (limit.effective_from_date = policy.effective_from_date 
  AND limit.effective_to_date = CONVERT(datetime, &#39;01/01/3000&#39;, 102)))

but the above condition creates a duplicate. Is there any effective way of selecting a record within overlapping date ranges.

Any help will be appreciated!

答案1

得分: 1

你的问题是在保单限额的时间段重叠,你需要选择一个时间段。根据我从你的数据中了解到的情况,你需要获取第一个时间段,其"保单限额"的"生效日期"早于"保单信息"的"保单生效日期",同时"保单限额"的"终止日期"晚于"保单信息"的"保单终止日期"。

如果我所有的猜测都正确,你可以这样做:

drop table if exists #PolicyInfo 
drop table if exists #PolicyLimit
CREATE TABLE #PolicyInfo (
   Policy INT,
   Policy_Effective_Date DATE,
   Policy_termination_date DATE,
   [Year] int
)
CREATE TABLE #PolicyLimit(
    LimitID INT, 
    Effective_Date DATE,
    Termination_Date DATE,
    Limit INT
)

INSERT INTO #PolicyInfo (Policy, Policy_Effective_Date, Policy_termination_date, [Year])
VALUES
    (001, '2018-10-01', '2019-10-01', 2018),
    (002, '2019-10-01', '2020-10-01', 2019),
    (003, '2020-10-01', '2021-10-01', 2020),
    (004, '2021-10-01', '2022-10-01', 2022)

INSERT INTO #PolicyLimit (LimitID, Effective_Date, Termination_Date, Limit)
VALUES 
    (1, '2018-10-01','2021-10-01',1000),
    (2, '2018-10-01','3000-01-01',2500)
    
;with cte AS (
    -- 连接PolicyInfo和PolicyLimit
    -- 条件: Policy_Effective_Date在Effective_Date和Termination_Date之间
    --            AND 
    --            Policy_Termination_Date在Effective_Date和Termination_Date之间
    SELECT *, 
        -- 根据Policy分区排名
        ROW_NUMBER() OVER (PARTITION BY [pi].Policy ORDER BY pl.Effective_Date, pl.Termination_Date) rn
    FROM #PolicyInfo [pi]
    INNER JOIN #PolicyLimit pl ON 
        [pi].Policy_Effective_Date BETWEEN pl.Effective_Date AND pl.Termination_Date
        AND [pi].Policy_termination_date BETWEEN pl.Effective_Date AND pl.Termination_Date
)
SELECT Policy, LimitID
FROM cte
WHERE rn = 1 -- 选择每个分区的第一个限额
英文:

Your problem is that you have overlapping periods for Policy Limits and you need to choose one. For what I understand from your data and I'm inferring a lot, you need to get the first limit for the FIRST period that it's [Policy Limit].[Effective Date] is earlier than the [Policy Info].[Policy Effective Date]
while [Policy Limit].[Termination Date] is later than [Policy Info].[Policy Termination Date].

If all my guessing is correct, you can do something like

drop table if exists #PolicyInfo 

drop table if exists #PolicyLimit
CREATE TABLE #PolicyInfo (
Policy INT,
Policy_Effective_Date DATE,
Policy_termination_date DATE,
[Year] int
)
CREATE TABLE #PolicyLimit(
LimitID INT,
Effective_Date DATE,
Termination_Date DATE,
Limit INT
)

INSERT INTO #PolicyInfo (Policy, Policy_Effective_Date, Policy_termination_date, [Year])
VALUES
    (001, &#39;2018-10-01&#39;, &#39;2019-10-01&#39;, 2018),
    (002, &#39;2019-10-01&#39;, &#39;2020-10-01&#39;, 2019),
    (003, &#39;2020-10-01&#39;, &#39;2021-10-01&#39;, 2020),
    (004, &#39;2021-10-01&#39;, &#39;2022-10-01&#39;, 2022)

INSERT INTO #PolicyLimit (LimitID, Effective_Date, Termination_Date, Limit)
VALUES 
    (1, &#39;2018-10-01&#39;,&#39;2021-10-01&#39;,1000),
    (2, &#39;2018-10-01&#39;,&#39;3000-01-01&#39;,2500)

;with cte AS (
    -- Join PolicyInfo with PolicyLimit
    -- condition: Policy_Effective_Date are between Effective_Date, pl.Termination_Date
    --            AND 
    --            Policy_Termination_Date are between Effective_Date, pl.Termination_Date
    SELECT *, 
        -- rank with partion by Policy
        ROW_NUMBER() OVER (PARTITION BY [pi].Policy ORDER BY pl.Effective_Date, pl.Termination_Date) rn
    FROM #PolicyInfo [pi]
    INNER JOIN #PolicyLimit pl ON 
        [pi].Policy_Effective_Date BETWEEN pl.Effective_Date AND pl.Termination_Date
        AND [pi].Policy_termination_date BETWEEN pl.Effective_Date AND pl.Termination_Date
)
SELECT Policy, LimitID
FROM cte
WHERE rn = 1 -- Select the first Limit per partition

huangapple
  • 本文由 发表于 2023年2月19日 14:03:27
  • 转载请务必保留本文链接:https://go.coder-hub.com/75498303.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定