【问题标题】:SQL - Change value on Row 3 when Case condition is met on Row 1SQL - 在第 1 行满足条件条件时更改第 3 行的值
【发布时间】:2017-06-30 03:26:19
【问题描述】:

我正在使用 SQL Oracle 并试图根据以下数据集找出当第 1 行满足条件时如何更新第 3 行?

规则是:如果 Check = Y,则“在之后的第 2 个月,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 语句。

【问题讨论】:

    标签: sql oracle case conditional-statements


    【解决方案1】:

    不太了解 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 在 cmets 中指出,这仅在您在数据集中表示每个月时才有效。如果您必须检查确切的日期,请改用此日期(并且如果您只关心年+月部分,请将 [Month] 的每个值转换为适当的粒度):

    /*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') 
    

    【讨论】:

    • 效果很好,我应该考虑滞后/领先!感谢您的提示!
    • @David - 如果没有整个月份怎么办,例如只有:2017-04, 2017-05, 2017-11。在这种情况下,从 2017-04 开始的 2 个月后将变为 2017-11。不是吗?
    • @Oto 我没有假设从月份字段中推断出任何功能,我将问题解释为“当按月份列排序时,代码='Y'的第 2 行”。
    猜你喜欢
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多