SQL-当第1行满足案例条件时,更改第3行的值
我正在使用SQL Oracle,并试图根据下面的数据集,找出在第1行满足条件时如何更新第3行 规则是:如果检查=Y,则“在之后的第2个月,下滑道=Y” 密码是ASQL-当第1行满足案例条件时,更改第3行的值,sql,oracle,case,conditional-statements,Sql,Oracle,Case,Conditional Statements,我正在使用SQL Oracle,并试图根据下面的数据集,找出在第1行满足条件时如何更新第3行 规则是:如果检查=Y,则“在之后的第2个月,下滑道=Y” 密码是A Code | Month | Check | Glidepath -------| -----------| ----- -|---------- A | 01/02/2017 | Y | N A | 01/03/2017 | N | N A | 01/04/2017 |
Code | Month | Check | Glidepath
-------| -----------| ----- -|----------
A | 01/02/2017 | Y | N
A | 01/03/2017 | N | N
A | 01/04/2017 | N | Y
A | 01/05/2017 | N | N
有什么想法吗
我一直在试用Case语句。对oracle语法了解不多,但显然从8.1.6版开始,LAG和LEAD就可用了: 您要做的是使用where子句更新表中的行,该子句评估以下内容:
LAG(Check,2) OVER (partition by Code order by month) = 'Y'
这样,表达式对于每个代码都是真的,其中月份比check=y的月份低2个
让我知道它是否有效,我只使用过SQL Server
如果这是SQL Server,代码将是
UPDATE t
SET Glidepath = 'Y'
FROM dbo.table as t
WHERE LAG(t.[Check],2) OVER (PARTITION BY t.[Code] ORDER BY t.[MONTH]) = 'Y'
编辑:Oto在评论中指出,只有在数据集中表示每个月时,这才有效。如果您必须检查确切日期,请使用此选项(如果您只关心年+月部分,请将[月]的每个值转换为适当的粒度):
它工作得很好,我应该考虑一下滞后/超前!谢谢你的提示@David-如果没有所有月份,例如只有:
2017-042017-052017-11
,该怎么办。在这种情况下,从2017-04
开始的2个月后将是2017-11
。不是吗?@Oto我没有假设从month字段推断出任何功能,我将问题解释为“当按month列排序时,代码为'Y'的第二行”。
/*what is the dateadd equivelent in oracle? ADD_MONTHS?*/
UPDATE t1
SET Glidepath = 'Y'
FROM dbo.[table] AS t1
WHERE EXISTS (SELECT * FROM dbo.[table] AS t2 WHERE t2.[Month] = DATEADD(MONTH, -2, t1.[MONTH]) AND t2.[Code] = 'Y')