sql - 更新 SQL Server 中的另一个行值
问题描述
我有一个包含名称、位置、开始日期和结束日期的表,如下所示:
+------+----------+-----------+-----------+-----------+
| 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
连续的开始日期
解决方案
这是一个差距和孤岛问题。这是一种使用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
姓名 | 位置 | 开始日期 | 结束日期 | 活跃 :--- | :------- | :--------- | :--------- | --------: 一个 | 德里| 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
推荐阅读
- angularjs - k-rebind 上的 md-input-container 问题
- javascript - 如何使css动画按需向前或向后播放
- javascript - 如何避免 for...in eslint 问题?
- python - 多列pandas df上的除法
- java - Java Android 简单重构
- c++ - 避免使用 std::any 编写相同的重复类型检查代码
- java - Spring 的 SwitchUserFilter 线程安全吗?
- sql - Mad cursor (SQL Server) 使程序冻结和崩溃
- reactjs - React Router 使用 /:username 或 /component/ 渲染组件
- gradle - 从 Procfile 调用 Gradlew