【问题标题】:SQL Server 2012, update record based on next recordSQL Server 2012,根据下一条记录更新记录
【发布时间】:2017-10-04 19:40:06
【问题描述】:

我正在努力寻找基于先前值更新(不仅仅是选择)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

【问题讨论】:

  • 你有什么定义“下一个”。您的示例数据中没有任何内容可用于定义订单。
  • 对不起,日期是排序值
  • 仍然无法真正对这些进行排序,因为这里有重复的行。但是你可以使用 DENSE_RANK 来做到这一点。给我几个,我会发布一个例子
  • 给定日期可以有多个值吗?

标签: sql sql-server lag


【解决方案1】:

获取不同的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、日期组合不能有多个值。

【讨论】:

  • 这实际上应该比我的解决方案的性能要好一些,但是这里的格式使得这很难破译。
【解决方案2】:

这是一个使用 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

【讨论】:

  • 这失败了。更新中的下一个值未在 CTE 中定义。
  • @AndrewO'Brien 真的吗???你真的试过了吗? NextValue 在 cte 中绝对定义。 cte 有 select *,表有 NextValue。
  • 抱歉,我没有注意到表变量中的下一个值,所以我没有注意到它。期待在 CTE 中看到它。你是对的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
相关资源
最近更新 更多