如何删除连续的相似行并只保留最近的行?
这里是我会怎么做:
;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...
。
谢谢你的伙伴 – Hamza
您可以收集想要保留在临时表中的所有行,truncate
您的原始表,并将临时表中的所有行插入原始表中。如果你有“很多重复”,这将比删除行更有效。此外truncate table
有以下限制
你不能对表使用TRUNCATE TABLE:
- 被一个外键约束引用。 (可以截断带有引用自身的外键的 表。)
- 参与索引视图。
- 通过使用事务复制或合并 复制发布。
- TRUNCATE TABLE无法激活触发器,因为操作确实没有记录单独的行删除 。欲了解更多信息,请参阅CREATE TRIGGER (Transact-SQL)
在SQL Azure的数据仓库和并行数据仓库:
- TRUNCATE TABLE是不允许的EXPLAIN语句内。
- TRUNCATE TABLE不能在事务内部运行。
您可以在下列主题中找到更多信息。
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
删除它们从表中删除?或者是一个返回不同记录的查询?代码,code_trim,libelle,unite和valeur的定义是否相同? –
这样的事情? https://stackoverflow.com/questions/19432913/select-info-from-table-where-row-has-max-date/19433107#19433107 – Twelfth
可能重复[检索每个组中的最后一条记录](https:/ /stackoverflow.com/questions/1313120/retrieving-the-last-record-in-each-group) –