[英]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个窗口函数调用,它们完全相同。 它们中的每一个都搜索属于特定操作( INSERT
, UPDATE
, DELETE
)的相同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.