更新 SQL Server 中的另一个行值

Posted

技术标签:

【中文标题】更新 SQL Server 中的另一个行值【英文标题】:Update another row value in SQL Server 【发布时间】:2020-07-29 14:43:30 【问题描述】:

我有一张表,其名称、位置、开始日期和结束日期如下:

+------+----------+-----------+-----------+-----------+
| name | location | startdate |  endate   | is_active |
+------+----------+-----------+-----------+-----------+
| A    | delhi    | 3/26/2019 | 3/26/2019 |         1 |
| A    | delhi    | 3/27/2019 | 3/27/2019 |         1 |
| A    | delhi    | 3/28/2019 | 3/28/2019 |         1 |
| A    | delhi    | 3/31/2019 | 3/31/2019 |         1 |
+------+----------+-----------+-----------+-----------+

需要像这样更新:

+------+----------+-----------+-----------+-----------+
| name | location | startdate |  endate   | is_active |
+------+----------+-----------+-----------+-----------+
| A    | delhi    | 3/26/2019 | 3/28/2019 |         1 |
| A    | delhi    | 3/27/2019 | 3/27/2019 |         0 |
| A    | delhi    | 3/28/2019 | 3/28/2019 |         0 |
| A    | delhi    | 3/31/2019 | 3/31/2019 |         1 |
+------+----------+-----------+-----------+-----------+

如果startdate 是连续的,则将结束日期更新为最后一个连续的startdate 的结束日期,同时更新is_active = 0 的连续开始日期

【问题讨论】:

请尝试重新格式化您的示例数据,使其更易读。我认为这样会更容易提供帮助。 【参考方案1】:

这是一个孤岛问题。这是一种使用lag() 和累积sum() 来定义组的方法。最后一步是条件逻辑:

select 
    name,
    location,
    startdate,
    case when row_number()  over(partition by name, location, grp order by startdate) = 1 
        then max(startdate) over(partition by name, location, grp) 
        else enddate
    end as enddate,
    case when row_number()  over(partition by name, location, grp order by startdate) = 1 
        then 1 
        else 0
    end as is_active
from (
    select 
        t.*, 
        sum(case when startdate = dateadd(day, 1, lag_enddate) then 0 else 1 end) 
            over(partition by name, location order by startdate) grp
    from (
        select 
            t.*, 
            lag(enddate) over(partition by name, location order by startdate) lag_enddate
        from mytable t
    ) t
) t

Demo on DB Fiddle

姓名 |位置 |开始日期 |结束日期 |活跃 :--- | :------- | :--------- | :--------- | --------: 一个 |德里| 2019-03-26 | 2019-03-28 | 1 一个 |德里| 2019-03-27 | 2019-03-27 | 0 一个 |德里| 2019-03-28 | 2019-03-28 | 0 一个 |德里| 2019-03-31 | 2019-03-31 | 1

【讨论】:

以上是关于更新 SQL Server 中的另一个行值的主要内容,如果未能解决你的问题,请参考以下文章

如果数据是从表中更新的,则应将数据插入到 SQL Server 2017 中的另一个表中

sql server"已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行" 解决方案

SQL Server 中的表、行值 UDF

Mysql根据不同的行更新表中的行值

sql server无法修改数据

SQL Server:将列数据值从一个表复制到同一数据库中的另一个表