我的要求是,以行的各列其前一行进行比较。
- 比较行的2行1
- 比较行3列2
而且,如果没有区别,我需要让该列NULL。例如:第3行的request_status_id与第2行的相同,所以我需要将第3行的request_status_id更新为NULL。
有没有一个干净的方法来做到这一点?
我的要求是,以行的各列其前一行进行比较。
而且,如果没有区别,我需要让该列NULL。例如:第3行的request_status_id与第2行的相同,所以我需要将第3行的request_status_id更新为NULL。
有没有一个干净的方法来做到这一点?
您可以使用下面的UPDATE
声明,它采用可LAG
窗函数从SQL Server 2012起:
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
我需要为表中的所有列执行此操作,而不仅限于'request_status_id'列。这是可能的单一陈述? – 2015-02-06 13:34:44
@VinayakPrabha你需要更新所有列?在OP中,你只是在谈论'request_status_id'。 – 2015-02-06 13:38:42
是的。 “request_status_id”只是我提到的一个例子。此外,屏幕截图中显示的列还有更多列。也需要为这些做同样的事情。 – 2015-02-06 13:43:52
@philipxy我需要比较更新表。将有数百行 – 2015-02-06 13:13:06