sql - 带有 LAG 的 SQL 更新
问题描述
我有以下更新,它根据先前的记录更新记录 -
WITH CTE AS(
SELECT
patient,
start,
CASE
WHEN
ISNULL(start, '') = ''
AND cd = '3'
AND LAG([thru_dt]) OVER (PARTITION BY [patient] ORDER BY cast(claimno AS int) ASC) BETWEEN CONVERT(VARCHAR, DATEADD(DAY, -30, thru_dt), 112) AND thru_dt
AND LAG([cd]) OVER (PARTITION BY [patient] ORDER BY cast(claimno AS int) ASC) = '30'
THEN LAG([start]) OVER (PARTITION BY [patient] ORDER BY cast(claimno AS int) ASC)
WHEN ISNULL(hhstrtdt, '') = '' AND
ROW_NUMBER() OVER(PARTITION BY patient ORDER BY cast(claimno AS int) DESC) = 1
AND LAG([cd]) OVER (PARTITION BY [patient] ORDER BY cast(claimno AS int) ASC) = '30'
AND LAG([thru_dt]) OVER (PARTITION BY [patient] ORDER BY cast(claimno AS int) ASC) BETWEEN CONVERT(VARCHAR, DATEADD(DAY, -30, thru_dt), 112) AND thru_dt
THEN LAG([start]) OVER (PARTITION BY [patient] ORDER BY cast(claimno AS int) ASC)
ELSE start
END AS new_start
FROM table
)
UPDATE CTE
SET start = new_start
此查询一次只更新一条记录。例如,如果我有这个输入 -
start patient cd
20190307 497863693 30
NULL 497863693 30
NULL 497863693 30
NULL 497863693 30
要更新所有 3 行,第一行的值为 NULL start
,我必须运行查询 3 次。
输出将是 -
start patient cd
20190307 497863693 30
20190307 497863693 30
20190307 497863693 30
20190307 497863693 30
有没有办法让查询更新上述患者的所有行,而不是一一进行?我可以保留表中 NULL 的计数,并在表中的 NULL 数量停止减少后使更新停止运行,但这似乎不是一个好方法。
解决方案
我认为一次更新整个表的最简单方法是这样的
with rn_cte as (
select * , row_number() over (partition by patient order by (select null)) rn
from tTable)
update tTable
set start=NULl
where rn>=2;
推荐阅读
- ios - Swift - CABasicAnimation 完成时更新 UIButton
- javascript - 逐图隐藏和显示幻灯片 - Javascript
- ibm-cloud - 如何为 Vyatta 获取“SoftLayer_Product_PackageInitParameters”
- mysql - AWS RDS 角色类型:主与实例
- jenkins - 在阶段内添加带有参数的构建?
- c++ - 在 C++ 中输入时未检测到换行符
- c# - 我如何找出计划属于哪个选项卡/位置?
- javascript - 如何更新 redis 中的多键哈希项?
- angular - AngularFire2 orderByChild 查询不成功
- typescript - 如何制作通用函数值?