如何删除连续的相似行并只保留最近的行?

问题描述:

我有这个表如何删除连续的相似行并只保留最近的行?

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) –

这里是我会怎么做:

;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

您可以收集想要保留在临时表中的所有行,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