有人可以解释一下此SQL Server代码吗?

时间:2019-09-01 20:19:33

标签: sql sql-server

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

    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

它正在执行的操作是使用“操作”列中的值并为它们分配一些优先级。

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的操作列中的第一个值比其连续值具有最高优先级,那么最终操作值将不会更改,直到出现最高优先级的值为止。

所以有人可以解释一下这段代码如何工作吗?

1 个答案:

答案 0 :(得分:0)

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

所以这个...

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

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

然后,COALESCE就像一个过滤器,将优先级放在搜索到的第一个动作(INSERT)上,否则回落到第二个(UPDATE),最后降到第三个( DELETE

所产生的行为就是您正确地改造后的行为。