更新 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 中的另一个表中