簡體   English   中英

SQL Server 2012,根據下一條記錄更新記錄

[英]SQL Server 2012, update record based on next record

我正在努力尋找一種基於以前的值來更新 (而不只是選擇)SQL表記錄的解決方案。 我可以使用LAG()函數獲取腳本來填充緊隨其后的記錄,但是當我在一行中具有相同的值(例如下面的“ CC”)時,就無法用下一個不是與當前值相同。

能夠添加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

獲取不同的baseid,value,date組合,並使用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,date組合不能有多個值。

這是一個使用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

暫無
暫無

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

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