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

标签 sql oracle case conditional-statements

我正在使用 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 语句。

最佳答案

不太了解 oracle 语法,但显然自版本 8.1.6 以来 LAG 和 LEAD 可用: https://oracle-base.com/articles/misc/lag-lead-analytic-functions

您想要做的是使用评估以下内容的 where 子句更新表中的行:

LAG(Check,2) OVER (partition by Code order by month) = 'Y'

这样,对于月份比 check = y 的月份低 2 的每个代码,表达式都为 true。

请告诉我它是否有效,我只使用过 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') 

关于SQL - 当第 1 行满足 Case 条件时更改第 3 行的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42182112/

相关文章:

WITH 语句中的 SQL 前 1 个

sql - 在 Oracle SQL (11g) 中选择所有带有 "Now minus 30 minutes"的行

sql - oracle sql 日期比较没有按预期工作

Oracle 搜索 View 文本

使用可为空参数的 SQL case 表达式

mysql - 为 SQL 按降序组织两列

用于从多个表增加多个 case 函数的 SQL 语句

c# - 时间显示在 SQL 的仅日期字段中

MySQL:基于 if/case 语句连接不同的表

sql - 我们可以写 case 语句而不使用 else 语句吗