2015-02-06 56 views
0

enter image description here如何比较同一个SQL Server表中的记录

我的要求是,以行的各列其前一行进行比较。

  1. 比较行的2行1
  2. 比较行3列2

而且,如果没有区别,我需要让该列NULL。例如:第3行的request_status_id与第2行的相同,所以我需要将第3行的request_status_id更新为NULL。

有没有一个干净的方法来做到这一点?

+0

@philipxy我需要比较更新表。将有数百行 – 2015-02-06 13:13:06

回答

2

您可以使用下面的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 

SQL Fiddle Demo here

编辑:

看来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 

SQL Fiddle Demo here

+0

我需要为表中的所有列执行此操作,而不仅限于'request_status_id'列。这是可能的单一陈述? – 2015-02-06 13:34:44

+0

@VinayakPrabha你需要更新所有列?在OP中,你只是在谈论'request_status_id'。 – 2015-02-06 13:38:42

+0

是的。 “request_status_id”只是我提到的一个例子。此外,屏幕截图中显示的列还有更多列。也需要为这些做同样的事情。 – 2015-02-06 13:43:52