【问题标题】:Can someone explain this SQL Server code?有人可以解释这个 SQL Server 代码吗?
【发布时间】:2019-09-01 20:19:33
【问题描述】:

我在其中一个存储过程中看到了当前使用的这段代码:

    COALESCE(MAX(CASE WHEN [ACTION] = 'INSERT' THEN ACTION END) OVER (PARTITION BY ID ORDER BY LAST_MODIFIED_DATE),
             MAX(CASE WHEN [ACTION] = 'UPDATE' THEN ACTION END) OVER (PARTITION BY ID ORDER BY LAST_MODIFIED_DATE),
             MAX(CASE WHEN [ACTION] = 'DELETE' THEN ACTION END) OVER (PARTITION BY ID ORDER BY LAST_MODIFIED_DATE)) AS FINAL_ACTION
FROM #A

它正在做的是使用 ACTION 列中的值并为它们分配一些优先级。

INSERT (1st priority)
UPDATE (2nd priority)
DELETE (3rd priority)

并根据 last_modified 日期值和 ACTION 列的优先级创建一个新列 FINAL_ACTION

比如我的输入数据是这样的

ID  ACTION  LAST_MODIFIED_DATE
------------------------------
1   INSERT  11-Feb
1   UPDATE  11-Mar
1   DELETE  14-Mar
2   UPDATE  12-Apr
2   INSERT  15-Apr
2   DELETE  19-Apr
3   UPDATE  2-Jan
3   DELETE  4-Jan
3   INSERT  7-Jan

那么输出将如下所示:

ID  ACTION  LAST_MODIFIED_DATE  FINAL ACTION
--------------------------------------------
1   INSERT  11-Feb             INSERT
1   UPDATE  11-Mar             INSERT
1   DELETE  14-Mar             INSERT
2   UPDATE  12-Apr             UPDATE
2   INSERT  15-Apr             INSERT
2   DELETE  19-Apr             INSERT
3   UPDATE  2-Jan              UPDATE
3   DELETE  4-Jan              UPDATE
3   INSERT  7-Jan              INSERT

所以基本上如果每个 id 的 action 列中的第一个值的优先级高于其后续值,那么最终的 action 值将不会改变,直到出现最高优先级的东西。

那么有人可以解释一下这段代码是如何工作的吗?

【问题讨论】:

  • @GuaravSingh 。 . .什么需要解释?逻辑似乎很清楚。您可以删除COALESCE() 并分别返回三列。

标签: sql sql-server


【解决方案1】:

表达式包含 3 个完全相同的窗口函数调用。它们中的每一个都搜索属于同一ID 的当前和先前记录以查找特定操作(INSERTUPDATEDELETE)。如果找到给定的动作,则窗口函数返回其名称,否则返回NULL

所以这个...

MAX(CASE WHEN [ACTION] = 'INSERT' THEN ACTION END) 
    OVER (PARTITION BY ID ORDER BY LAST_MODIFIED_DATE)

...如果当前记录或具有相同ID 和更早LAST_MODIFIED_DATE 的另一个记录在ACTION 列中具有值'INSERT',则将返回字符串'INSERT'

然后,COALESCE 就像一个过滤器,它优先考虑第一个搜索的操作 (INSERT),否则会退回到第二个 (UPDATE),最后是第三个 (DELETE)。

由此产生的行为是您正确逆向设计的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多