Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-当第1行满足案例条件时,更改第3行的值_Sql_Oracle_Case_Conditional Statements - Fatal编程技术网

SQL-当第1行满足案例条件时,更改第3行的值

SQL-当第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 |

我正在使用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 | 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')