SQL - 根据实体的先前记录更新记录
SQL - Update Record Based on Entity's Previous Record
我有一个临时 table,它有一个实体 ID、开始日期、结束日期和天数。我通过获取开始日期和结束日期之间的 datediff 和 +1 天来获取天数。我遇到的问题是,当一个实体的第二条记录的开始日期与其前一个结束日期相同时,我得到的天数太多了。即:
EntityID StartDate EndDate NumOfDays
-------- --------- ------- ---------
3414 02/01/2018 02/02/2018 2
3414 02/02/2018 02/10/2018 9
我需要将第二条记录的 StartDate 设为 02/03/2018,NumOfDays 变为 8,这样整个天数范围就是 10,这是正确的。 temp table 是在 EntityID、StartDate 上订购的。 table 中会有数千条记录,可能有几百条记录有这种情况。如果该实体之前的结束日期相同,我只需要更改开始日期。
我应该做一个循环吗?光标?或者有更好的方法吗?
我们在 SQL Server 2014
首先,您似乎应该计算没有结束日期的天数。那将解决问题。但是,这可能行不通。
您可以使用可更新的 CTE:
with toupdate as (
select t.*, lag(end_date) over (partition by entityid order by start_date) as prev_end_date
from t
)
update toupdate
set numofdays = numofdays - 1
where prev_end_date = end_date;
Declare @t TABLE (EntityID INT, StartDate DATE, EndDate DATE)
INSERT INTO @t VALUES
(3414 ,'02/01/2018','02/02/2018'),
(3414 ,'02/02/2018','02/10/2018');
WITH x AS (
SELECT t.*
, CASE WHEN LAG(EndDate) OVER (PARTITION BY EntityID ORDER BY StartDate) >= StartDate
THEN DATEADD( DAY , 1 , LAG(EndDate) OVER (PARTITION BY EntityID ORDER BY StartDate))
ELSE StartDate END NewStartDate
FROM @t t
)
SELECT EntityID
, NewStartDate
, EndDate
, DATEDIFF(DAY, NewStartDate , EndDate) + 1 AS NumOfDays
FROM X
我有一个临时 table,它有一个实体 ID、开始日期、结束日期和天数。我通过获取开始日期和结束日期之间的 datediff 和 +1 天来获取天数。我遇到的问题是,当一个实体的第二条记录的开始日期与其前一个结束日期相同时,我得到的天数太多了。即:
EntityID StartDate EndDate NumOfDays
-------- --------- ------- ---------
3414 02/01/2018 02/02/2018 2
3414 02/02/2018 02/10/2018 9
我需要将第二条记录的 StartDate 设为 02/03/2018,NumOfDays 变为 8,这样整个天数范围就是 10,这是正确的。 temp table 是在 EntityID、StartDate 上订购的。 table 中会有数千条记录,可能有几百条记录有这种情况。如果该实体之前的结束日期相同,我只需要更改开始日期。
我应该做一个循环吗?光标?或者有更好的方法吗?
我们在 SQL Server 2014
首先,您似乎应该计算没有结束日期的天数。那将解决问题。但是,这可能行不通。
您可以使用可更新的 CTE:
with toupdate as (
select t.*, lag(end_date) over (partition by entityid order by start_date) as prev_end_date
from t
)
update toupdate
set numofdays = numofdays - 1
where prev_end_date = end_date;
Declare @t TABLE (EntityID INT, StartDate DATE, EndDate DATE)
INSERT INTO @t VALUES
(3414 ,'02/01/2018','02/02/2018'),
(3414 ,'02/02/2018','02/10/2018');
WITH x AS (
SELECT t.*
, CASE WHEN LAG(EndDate) OVER (PARTITION BY EntityID ORDER BY StartDate) >= StartDate
THEN DATEADD( DAY , 1 , LAG(EndDate) OVER (PARTITION BY EntityID ORDER BY StartDate))
ELSE StartDate END NewStartDate
FROM @t t
)
SELECT EntityID
, NewStartDate
, EndDate
, DATEDIFF(DAY, NewStartDate , EndDate) + 1 AS NumOfDays
FROM X