我已经看到了其中一个存储过程中当前使用的代码:
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的操作列中的第一个值比其连续值具有最高优先级,那么最终操作值将不会更改,直到出现最高优先级的值为止。
所以有人可以解释一下这段代码如何工作吗?
答案 0 :(得分:0)
该表达式包含3个完全相同的窗口函数调用。他们每个人都搜索属于同一ID
的当前记录和先前记录以进行特定操作(INSERT
,UPDATE
,DELETE
)。如果找到给定的动作,则窗口函数返回其名称,否则返回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
。
所产生的行为就是您正确地改造后的行为。