Estou tentando excluir linhas duplicadas, mas deixando linhas atualizadas recentes.
Aqui está uma ilustração do meu conjunto de dados:
Estou tentando excluir duas linhas que são dados mais antigos (neste caso, 19/11 - destacadas em amarelo).
Este é o conjunto de dados em texto:
funcionário | EU IA | punch_start | punch_end | punch_hours | data_carga |
---|---|---|---|---|---|
John Doe | 276567 | 30 de setembro de 2023 14h50 | 1º de outubro de 2023 6h | 15.16666667 | 19/11/23 14h45 |
Jane Doe | 140037 | 30 de setembro de 2023 22:00 | 1º de outubro de 2023 7h05 | 9.083333333 | 19/11/23 14h45 |
John Doe | 276567 | 30 de setembro de 2023 14h50 | 1º de outubro de 2023 6h | 15.16666667 | 20/11/23 14h45 |
Jane Doe | 140037 | 30 de setembro de 2023 22:00 | 1º de outubro de 2023 7h05 | 9.083333333 | 20/11/23 14h45 |
Eu tentei com este código (baseado neste post ):
with todelete as
(
select
,[employee]
,[ID]
,[punch_start]
,[punch_end]
,[punch_hours]
,row_number() over
(
partition by
[employee]
,[ID]
,[punch_start]
,[punch_end]
,[punch_hours]
order by [date_load] desc) as seqnum
from [dbo].[dataset]
)
select * from todelete where seqnum > 1;
delete from todelete where seqnum > 1;
Mas o resultado (no Select *) é:
Como modificamos o código para distinguir/selecionar apenas linhas que possuem [date_load] mais antigas?
Talvez DELETE no SQL Server tenha sintaxe suficiente para suportar isso, mas geralmente faço MERGE aqui.
https://dbfiddle.uk/_5PR_82q
Além disso, talvez o SQL Server faça alguma mágica que eu não conheço. Mas na sua pergunta original
Provavelmente falhará na sintaxe. Porque todelete é apenas um cte definido em uma consulta totalmente separada.