簡體   English   中英

如何比較同一SQL Server表中的記錄

[英]How to compare records in same SQL Server table

在此處輸入圖片說明

我的要求是將行的每一列與其上一行進行比較。

  1. 比較第2行和第1行
  2. 比較第3行和第2行

另外,如果沒有區別,則需要將該列設置為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

SQL Fiddle演示在這里

編輯:

似乎OP的要求是將表的每一列都SETNULL ,以防先前的值與當前值相同。 在這種情況下,查詢變得更加冗長。 這是設置兩個列的示例。 可以輕松地擴展它以合並表的任何其他列:

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演示在這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM