
我的要求是将行的每一列与其上一行进行比较。
此外,如果没有区别,我需要使该列为空。例:第3行的request_status_id与第2行的相同,所以我需要将第3行的request_status_id更新为NULL。
有干净的方法吗?
发布于 2015-02-06 13:16:05
可以使用以下UPDATE语句,该语句使用Server 2012以后可用的LAG窗口函数:
UPDATE #mytable
SET request_status_id = NULL
FROM #mytable AS m
INNER JOIN (
SELECT payment_history_id, request_status_id,
LAG(request_status_id) OVER(ORDER BY payment_history_id) AS prevRequest_status_id
FROM #mytable ) t
ON m.payment_history_id = t.payment_history_id
WHERE t.request_status_id = t.prevRequest_status_idSQL Fiddle演示
编辑:
如果前面的值与当前值相同,则OP的要求似乎是将表中的每一列SET为NULL。在这种情况下,查询变得更加冗长。下面是一个设置两个列的示例。它可以很容易地扩展到包括表格中的任何其他列:
UPDATE #mytable
SET request_status_id = CASE WHEN t.request_status_id = t.prevRequest_status_id THEN NULL
ELSE T.request_status_id
END,
request_entity_id = CASE WHEN t.request_entity_id = t.prevRequest_entity_id THEN NULL
ELSE t.request_entity_id
END
FROM #mytable AS m
INNER JOIN (
SELECT payment_history_id, request_status_id, request_entity_id,
LAG(request_status_id) OVER(ORDER BY payment_history_id) AS prevRequest_status_id,
LAG(request_entity_id) OVER(ORDER BY payment_history_id) AS prevRequest_entity_id
FROM #mytable ) t
ON m.payment_history_id = t.payment_history_idSQL Fiddle演示
https://stackoverflow.com/questions/28366360
复制相似问题