使用SQL Oracle并尝试根据以下数据集找出在第1行遇到条件时如何更新第3行?
规则是:如果Check = Y则“在第二个月后,Glidepath = 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声明。
答案 0 :(得分:3)
不太了解oracle语法,但显然LAG和LEAD从版本8.1.6开始可用:https://oracle-base.com/articles/misc/lag-lead-analytic-functions
您要做的是使用where子句更新行表,以评估以下内容:
LAG(Check,2) OVER (partition by Code order by month) = 'Y'
这样表达式对于每个代码都是正确的,其中月份是从月份开始的2,而check = y。
让我知道它是否有效,我只使用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在评论中指出,只有在数据集中表示每个月时,这才有效。如果你必须检查确切的日期,请使用它(如果你只关心年份+月份,则将[月]的每个值转换为适当的粒度):
/*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')