[英]How to compare records in same SQL Server table
我的要求是将行的每一列与其上一行进行比较。
另外,如果没有区别,则需要将该列设置为NULL。 例如:第3行的request_status_id与第2行的相同,因此我需要将第3行的request_status_id更新为NULL。
有没有一种干净的方法可以做到这一点?
您可以使用下面的UPDATE
语句,该语句采用从SQL 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_id
编辑:
似乎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_id
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.