繁体   English   中英

有人可以解释这个SQL Server代码吗?

[英]Can someone explain this SQL Server code?

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

    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列中的第一个值比其连续值具有最高优先级,那么在最高优先级之后出现之前,最终动作值将不会被更改。

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

该表达式包含3个窗口函数调用,它们完全相同。 它们中的每一个都搜索属于特定操作( INSERTUPDATEDELETE )的相同ID的当前和前一个记录。 如果找到给定的操作,则窗口函数返回其名称,否则返回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 )。

由此产生的行为是您正确的逆向工程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM