簡體   English   中英

SQL-基於實體的先前記錄的更新記錄

[英]SQL - Update Record Based on Entity's Previous Record

我有一個臨時表,該表具有一個entityID,一個開始日期,一個結束日期和天數。 我通過獲取開始日期和結束日期以及+1天之間的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,這是正確的。 臨時表在EntityID StartDate上排序。 表中將有成千上萬的記錄,而在這種情況下可能有數百條記錄。 如果該實體的上一個結束日期相同,則僅需要更改開始日期。

我應該循環嗎? 光標? 或者,還有更好的方法?

我們正在使用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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM