2017-10-10 87 views
-1

我有這個表如何刪除連續的相似行並只保留最近的行?

the source

我想刪除連續類似的行,並保持最近。 這樣的結果我想有是這樣的

the result

+0

刪除它們從表中刪除?或者是一個返回不同記錄的查詢?代碼,code_trim,libelle,unite和valeur的定義是否相同? –

+0

這樣的事情? https://stackoverflow.com/questions/19432913/select-info-from-table-where-row-has-max-date/19433107#19433107 – Twelfth

+0

可能重複[檢索每個組中的最後一條記錄](https:/ /stackoverflow.com/questions/1313120/retrieving-the-last-record-in-each-group) –

回答

0

這裏是我會怎麼做:

;WITH cte AS (
    SELECT valeur, date_reference, id, rownum = ROW_NUMBER() OVER (ORDER BY date_reference) FROM #temperatures 
    UNION ALL 
    SELECT NULL, NULL, NULL, (SELECT COUNT(*) FROM #temperatures) + 1 
) 
SELECT A.* FROM cte AS A INNER JOIN cte AS B ON A.rownum + 1 = B.rownum AND COALESCE(a.valeur, -459) != COALESCE(b.valeur, -459) 

我打電話表#temperatures。使用CTE爲每條記錄分配一個ROW_NUMBER,並在最後一個Row_Number中包含一條額外記錄(否則最後一條記錄將不會包含在以下查詢中)。然後,來自CTE的SELECT,其中下一個ROW_NUMBER不具有相同的valeur

現在,如果您想要從原始表格中刪除DELETE,您可以查看此查詢的返回信息,以確保您確實想刪除不在此返回中的所有記錄。然後,假設historique_id是主鍵,DELETE FROM #temperatures WHERE historique_id NOT IN (SELECT historique_id FROM cte AS A...

+0

謝謝你的夥伴 – Hamza

0

您可以收集想要保留在臨時表中的所有行,truncate您的原始表,並將臨時表中的所有行插入原始表中。如果你有「很多重複」,這將比刪除行更有效。此外truncate table有以下限制

你不能對錶使用TRUNCATE TABLE:

  1. 被一個外鍵約束引用。 (可以截斷帶有引用自身的外鍵的 表。)
  2. 參與索引視圖。
  3. 通過使用事務複製或合併 複製發佈。
  4. TRUNCATE TABLE無法激活觸發器,因爲操作確實沒有記錄單獨的行刪除 。欲瞭解更多信息,請參閱CREATE TRIGGER (Transact-SQL)

在SQL Azure的數據倉庫和並行數據倉庫:

  1. TRUNCATE TABLE是不允許的EXPLAIN語句內。
  2. TRUNCATE TABLE不能在事務內部運行。

您可以在下列主題中找到更多信息。

Truncate in SQL SERVER

Deleting Data in SQL Server with TRUNCATE vs DELETE commands

你可以使用這個腳本通過截斷,插入戰略

CREATE TABLE #temp_hisorique(
code varchar(50), 
code_trim varchar(50), 
libelle varchar(50), 
unite varchar(50), 
valeur varchar(50), 
date_reference datetime, 
hisoriqueID int 
) 
GO 
;WITH cte AS (
    select *, row_number() over(partition by code, code_trim, libelle, unite, valeur order by date_reference desc) as rownum 
    from mytable 
) 

insert into #temp_hisorique(code, code_trim, libelle, unite, valeur, date_reference, hisoriqueID) 
select code, code_trim, libelle, unite, valeur, date_reference, hisoriqueID 
from cte 
where rownum = 1 

TRUNCATE TABLE mytable 

insert into mytable(code, code_trim, libelle, unite, valeur, date_reference, hisoriqueID) 
select code, code_trim, libelle, unite, valeur, date_reference, hisoriqueID 
from #temp_hisorique 

去除重複行或者你可以只是刪除命令刪除的行與加盟。

;WITH cte AS (
    select *, row_number() over(partition by code, code_trim, libelle, unite, valeur order by date_reference desc) as rownum 
    from mytable 
) 

delete T 
from mytable T 
join cte on T.hisoriqueID = cte.hisoriqueID 
where cte.rownum > 1 
相關問題