【发布时间】: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