2017-10-04 141 views
0

我正努力尋找更新(不僅僅是選擇)基於先前值的SQL表記錄的解決方案。我可以讓腳本使用LAG()函數填充隨後的記錄,但是當我在一行中具有相同的值時(例如下面的'CC'),我無法用它填充下一個不是與當前值相同。SQL Server 2012基於下一條記錄的更新記錄

能夠添加CASE/WHEN條件以便僅評估具有相同BaseID的值也將有所幫助。任何幫助將不勝感激。

這是我想要的結果:

BaseID Value Date  NextValue 
1  AA  2017-10-01 BB 
1  BB  2017-10-02 CC 
1  CC  2017-10-03 DD 
1  CC  2017-10-03 DD 
1  CC  2017-10-03 DD 
1  DD  2017-10-04 NULL 
2  EE  2017-10-01 FF 
2  FF  2017-10-02 GG 
2  GG  2017-10-03 NULL 
+1

你有什麼需要定義「下一個」。您的示例數據中沒有任何內容可用於定義訂單。 –

+0

對不起,日期是排序值 – dbreienrk1

+0

仍然不能真正地排序這些,因爲你在這裏有重複的行。但是你可以使用DENSE_RANK來做到這一點。給我一對夫婦,我會發佈一個例子 –

回答

0

獲取不同baseid之後,價值,日期組合和使用lead在CTE獲得下一個值,並使用國際熱帶木材組織update

with cte as (select t1.baseid,t1.value,t1.nextvalue,t2.nxt_value 
      from tbl t1 
      left join (select t.*,lead(value) over(partition by baseid order by datecol) as nxt_value 
         from (select distinct baseid,datecol,value from tbl) t 
         ) t2 
      on t1.baseid=t2.baseid and t1.datecol=t2.datecol and t1.value=t2.value 
      ) 
update cte set nextvalue=nxt_value 

這裏假設給定的baseid,日期組合不能有多個值。

+0

這實際上應該比我的解決方案稍微好一點,但是這裏的格式使得難以破譯。 –

0

這是一個使用DENSE_RANK作爲另一個選項的工作示例。

declare @Something table 
(
    BaseID int 
    , MyValue char(2) 
    , MyDate date 
    , NextValue char(2) 
) 

insert @Something 
(
    BaseID 
    , MyValue 
    , MyDate 
) VALUES 
(1, 'AA', '2017-10-01') 
, (1, 'BB', '2017-10-02') 
, (1, 'CC', '2017-10-03') 
, (1, 'CC', '2017-10-03') 
, (1, 'CC', '2017-10-03') 
, (1, 'DD', '2017-10-04') 
, (2, 'EE', '2017-10-01') 
, (2, 'FF', '2017-10-02') 
, (2, 'GG', '2017-10-03') 
; 

with SortedResults as 
(
    select * 
     , DENSE_RANK() over(partition by BaseID order by BaseID, MyDate) as MyRank 
    from @Something 
) 

update sr set NextValue = sr2.MyValue 
from SortedResults sr 
join SortedResults sr2 on sr2.MyRank - 1 = sr.MyRank and sr.BaseID = sr2.BaseID 


select * 
from @Something 
+0

失敗。您的更新中的下一個值未在您的CTE中定義。 –

+0

@ AndrewO'Brien真的嗎?你真的嘗試過嗎? NextValue在cte中是絕對定義的。該cte選擇*並且該表具有NextValue。 –

+0

對不起,我沒有注意到表變量中的下一個值,並將其保留在我的範圍之外。期待在CTE中看到它。你是對的。 –