SQL - Eliminación de "DUPLICADOS"

 
Vista:
sin imagen de perfil
Val: 7
Ha disminuido su posición en 6 puestos en SQL (en relación al último mes)
Gráfica de SQL

Eliminación de "DUPLICADOS"

Publicado por José Miguel (3 intervenciones) el 11/03/2019 13:43:01
Buenas tardes a todos. He revisado varias consultas hechas sobre este tema, pero no termino de encontrar la ayuda que necesito.

Tengo una tabla en SQL Server 2014 en la que existen (además de otras) 2 columnas, CODIGO (nvarchar) y FECHA (datetime).

Existen múltiples registros con el mismo CODIGO, pero con fechas distintas. Por cada registro de un mismo CODIGO, el resto de las columnas pueden contener datos distintos en cada registro.

Necesito dejar exclusivamente el registro más antiguo de cada CODIGO donde la antigüedad la marca el campo FECHA.

¿Alguien puede orientarme de como hacerlo? Porque ando un poco perdido.

Muchas gracias a todos.


2019-03-11_133812
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias
Val: 2.552
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Eliminación de "DUPLICADOS"

Publicado por Isaias (1673 intervenciones) el 11/03/2019 18:02:43
Le dejo el codigo con un ejemplo, si se le dificulta, digame y lo revisamos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
CREATE TABLE #temp
(
code int,
iencucod int,
duracion int
)
 
INSERT INTO #temp values (1,2999,1062)
INSERT INTO #temp values (1,2999,1062)
INSERT INTO #temp values (1,2999,1062)
INSERT INTO #temp values (1,2999,1062)
INSERT INTO #temp values (1,2999,1062)
INSERT INTO #temp values (1,2999,1062)
INSERT INTO #temp values (2,2999,610)
INSERT INTO #temp values (3,2999,34)
INSERT INTO #temp values (4,6170,447)
INSERT INTO #temp values (5,15729,1148)
INSERT INTO #temp values (6,15729,241)
INSERT INTO #temp values (6,15729,241)
INSERT INTO #temp values (6,15729,241)
INSERT INTO #temp values (7,15729,53)
INSERT INTO #temp values (8,38314,1029)
INSERT INTO #temp values (8,38314,1029)
INSERT INTO #temp values (8,38314,1029)
INSERT INTO #temp values (9,38314,256)
 
select * from #temp
 
 
WITH CTE (code, iencucod, duracion, DuplicateCount)
AS
(
SELECT code,iencucod, duracion,
ROW_NUMBER() OVER(PARTITION BY code, iencucod, duracion ORDER BY code,iencucod, duracion) AS DuplicateCount
FROM #temp
)
DELETE
FROM CTE
WHERE DuplicateCount > 1
GO
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 7
Ha disminuido su posición en 6 puestos en SQL (en relación al último mes)
Gráfica de SQL

Eliminación de "DUPLICADOS"

Publicado por José Miguel (3 intervenciones) el 11/03/2019 21:03:47
Muchas gracias por interesarte, pero no es lo que ando buscando, o al menos no soy capaz de adaptarlo.

El resultado que obtengo es la eliminación de todos los duplicados menos el primero de cada conjunto de duplicado.

He adaptado tu ejemplo al tipo de datos con el que me voy a enfrentar.


rr1
Este es el primer bloque de duplicados.

rr2
Y este es el resultado obtenido.

Como puedes observar, para el "code" 1 ha dejado unicamente el primer registro que ha encontrado. Lo que necesito es que eliminara todos menos el de fecha más antigua (registro nº 5 de la 1º imagen)

Si puedes ayudarme de alguna manera te lo agradecería enormemente.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Vega
Val: 181
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Eliminación de "DUPLICADOS"

Publicado por Vega (69 intervenciones) el 11/03/2019 23:43:33
una pregunta primero,
quieres que te los borre, o que te los sume para que aparezca una fila sumando el valor de 'Duracion'?

si es borrar, la particion de la funcion ROW_NUMBER() sería la siguiente:
, row_number() over (partition by code order by iencucod desc)

quedando así:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
WITH CTE (code, iencucod, duracion, DuplicateCount)
 
AS
 
(
 
SELECT code,iencucod, duracion,
 
ROW_NUMBER() OVER(PARTITION BY code ORDER BY iencucod asc) AS DuplicateCount
 
FROM #temp
 
)
 
DELETE
 
FROM CTE
 
WHERE DuplicateCount > 1
 
GO
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 7
Ha disminuido su posición en 6 puestos en SQL (en relación al último mes)
Gráfica de SQL

Eliminación de "DUPLICADOS"

Publicado por José Miguel (3 intervenciones) el 12/03/2019 08:42:51
Buenos días. Muchísimas gracias por tu orientación. Ya lo he conseguido.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias
Val: 2.552
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Eliminación de "DUPLICADOS"

Publicado por Isaias (1673 intervenciones) el 12/03/2019 18:41:12
El truco esta en el ORDER BY, si quieres que te borre el mas ANTIGUO, debes ordenarlo por la fecha, DESC o ASC, según su necesidad, que bueno que lo consiguio
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar