Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

algo más que eliminar duplicados en sql server

Estas en el tema de algo más que eliminar duplicados en sql server en el foro de SQL Server en Foros del Web. Holas, tengo un problema con el que llevo un bueno tiempo dandole vueltas... Tengo una tabla llamada miTabla, tiene sólo 3 columnas, guid (aleatorio unico, ...
  #1 (permalink)  
Antiguo 02/08/2011, 14:33
 
Fecha de Ingreso: septiembre-2005
Mensajes: 74
Antigüedad: 18 años, 7 meses
Puntos: 0
algo más que eliminar duplicados en sql server

Holas, tengo un problema con el que llevo un bueno tiempo dandole vueltas...

Tengo una tabla llamada miTabla, tiene sólo 3 columnas, guid (aleatorio unico, irrepetible), iencucod (código simple), duracion (en segundos, entero):

Quiero eliminar duplicados por el campo "iencucod" pero el registro que quede... tiene que tener la duración mayor.



Osea me quiero quedar con los que estan enmarcados en los rectangulos rojos, parece simple pero no lo es.

Mas o menos mi código es así pero aún le falta algo para que coja el guid correspondiente:

SELECT 'acá falta el guid', iencucod, max(duracion) from miTabla group by iencucod

Gracias para los que me den al menos una guía de cómo tratar este tipo de problemas.
  #2 (permalink)  
Antiguo 02/08/2011, 15:22
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: algo más que eliminar duplicados en sql server

Y si haces algo asi:


Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. code INT,
  4. iencucod INT,
  5. duracion INT
  6. )
  7.  
  8. INSERT INTO #temp VALUES (1,2999,1062)
  9. INSERT INTO #temp VALUES (2,2999,610)
  10. INSERT INTO #temp VALUES (3,2999,34)
  11. INSERT INTO #temp VALUES (4,6170,447)
  12. INSERT INTO #temp VALUES (5,15729,1148)
  13. INSERT INTO #temp VALUES (6,15729,241)
  14. INSERT INTO #temp VALUES (7,15729,53)
  15. INSERT INTO #temp VALUES (8,38314,1029)
  16. INSERT INTO #temp VALUES (9,38314,256)
  17.  
  18.  
  19. SELECT code,duracion,iencucod FROM #temp WHERE
  20. CONVERT(VARCHAR(20),duracion) + '#' + CONVERT(VARCHAR(20),iencucod)  IN
  21. (
  22.  
  23. SELECT CONVERT(VARCHAR(20),MAX(duracion)) + '#' + CONVERT(VARCHAR(20),iencucod) FROM #temp GROUP BY iencucod
  24.  
  25. )

Saludos!!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 03/08/2011, 09:07
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: algo más que eliminar duplicados en sql server

¿Nos podrias decir que VERSION - EDICION de SQL Server manejas?
__________________
MCTS Isaias Islas
  #4 (permalink)  
Antiguo 04/08/2011, 14:49
 
Fecha de Ingreso: septiembre-2005
Mensajes: 74
Antigüedad: 18 años, 7 meses
Puntos: 0
Respuesta: algo más que eliminar duplicados en sql server

Ah sí me olvidaba, uso el sql server 2008 express edition, "Libras" voy a revisar el codigo que posteaste, gracias.
  #5 (permalink)  
Antiguo 04/08/2011, 16:34
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: algo más que eliminar duplicados en sql server

Si es 2008, puedes hacer uso de CTE para eliminar los duplicados, te pongo un ejemplo

Código SQL:
Ver original
  1. WITH Dublicates_CTE(Username, accountid)
  2. AS
  3. (
  4. SELECT UserName,MIN(accountid)
  5. FROM Accounts
  6. GROUP BY username
  7. HAVING COUNT(*) > 1
  8. )
  9. DELETE FROM Accounts
  10. WHERE accountid IN (
  11. SELECT Accounts.accountid
  12. FROM Accounts
  13. INNER JOIN Dublicates_CTE
  14. ON Accounts.Username = Dublicates_CTE.Username
  15. AND Accounts.accountid <> Dublicates_CTE.accountid
__________________
MCTS Isaias Islas
  #6 (permalink)  
Antiguo 08/08/2011, 15:45
 
Fecha de Ingreso: septiembre-2005
Mensajes: 74
Antigüedad: 18 años, 7 meses
Puntos: 0
Respuesta: algo más que eliminar duplicados en sql server

Cita:
Iniciado por Libras Ver Mensaje
Y si haces algo asi:


Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. code INT,
  4. iencucod INT,
  5. duracion INT
  6. )
  7.  
  8. INSERT INTO #temp VALUES (1,2999,1062)
  9. INSERT INTO #temp VALUES (2,2999,610)
  10. INSERT INTO #temp VALUES (3,2999,34)
  11. INSERT INTO #temp VALUES (4,6170,447)
  12. INSERT INTO #temp VALUES (5,15729,1148)
  13. INSERT INTO #temp VALUES (6,15729,241)
  14. INSERT INTO #temp VALUES (7,15729,53)
  15. INSERT INTO #temp VALUES (8,38314,1029)
  16. INSERT INTO #temp VALUES (9,38314,256)
  17.  
  18.  
  19. SELECT code,duracion,iencucod FROM #temp WHERE
  20. CONVERT(VARCHAR(20),duracion) + '#' + CONVERT(VARCHAR(20),iencucod)  IN
  21. (
  22.  
  23. SELECT CONVERT(VARCHAR(20),MAX(duracion)) + '#' + CONVERT(VARCHAR(20),iencucod) FROM #temp GROUP BY iencucod
  24.  
  25. )

Saludos!!
Me sirvió el código, gracias. Pero hay un pequeño inconveniente, mi tabla puede variar, puede darse el caso de que tenga duraciones iguales:

insert into #temp values (1,2999,1062)
insert into #temp values (2,2999,1062)

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 (7,15729,53)
insert into #temp values (8,38314,1029)
insert into #temp values (9,38314,256)

en este caso no me elimina los duplicados 1,2999, 1062 y 2,2999,1062.
Mi objetivo es eliminar duplicados y dejar el de mayor duración, en este último caso dejar cualquiera de los dos ya que tienen duración igual.

Gracias por la ayuda brindada.
  #7 (permalink)  
Antiguo 08/08/2011, 16:00
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: algo más que eliminar duplicados en sql server

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2.     (
  3.     code INT,
  4.     iencucod INT,
  5.     duracion INT
  6.     )
  7.      
  8.     INSERT INTO #temp VALUES (1,2999,1062)
  9.     INSERT INTO #temp VALUES (2,2999,1062)
  10.     INSERT INTO #temp VALUES (3,2999,34)
  11.     INSERT INTO #temp VALUES (4,6170,447)
  12.     INSERT INTO #temp VALUES (5,15729,1148)
  13.     INSERT INTO #temp VALUES (6,15729,241)
  14.     INSERT INTO #temp VALUES (7,15729,53)
  15.     INSERT INTO #temp VALUES (8,38314,1029)
  16.     INSERT INTO #temp VALUES (9,38314,256)
  17.      
  18.  SELECT code,duracion,iencucod FROM
  19. (    
  20.     SELECT ROW_NUMBER() OVER(partition BY iencucod,duracion ORDER BY iencucod,duracion) AS rn, code,duracion,iencucod
  21.     FROM #temp
  22.     WHERE
  23.     CONVERT(VARCHAR(20),duracion) + '#' + CONVERT(VARCHAR(20),iencucod)  IN
  24.     (
  25.      
  26.  
  27.         SELECT CONVERT(VARCHAR(20),MAX(duracion)) + '#' + CONVERT(VARCHAR(20),iencucod) AS cadena FROM #temp GROUP BY iencucod
  28.  
  29.      
  30.     )
  31. ) t2 WHERE rn=1

No habias aclarado ese punto prueba este codigo y comentas :)

Saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #8 (permalink)  
Antiguo 09/08/2011, 12:24
 
Fecha de Ingreso: septiembre-2005
Mensajes: 74
Antigüedad: 18 años, 7 meses
Puntos: 0
Respuesta: algo más que eliminar duplicados en sql server

Cita:
Iniciado por Libras Ver Mensaje
Código SQL:
Ver original
  1. CREATE TABLE #temp
  2.     (
  3.     code INT,
  4.     iencucod INT,
  5.     duracion INT
  6.     )
  7.      
  8.     INSERT INTO #temp VALUES (1,2999,1062)
  9.     INSERT INTO #temp VALUES (2,2999,1062)
  10.     INSERT INTO #temp VALUES (3,2999,34)
  11.     INSERT INTO #temp VALUES (4,6170,447)
  12.     INSERT INTO #temp VALUES (5,15729,1148)
  13.     INSERT INTO #temp VALUES (6,15729,241)
  14.     INSERT INTO #temp VALUES (7,15729,53)
  15.     INSERT INTO #temp VALUES (8,38314,1029)
  16.     INSERT INTO #temp VALUES (9,38314,256)
  17.      
  18.  SELECT code,duracion,iencucod FROM
  19. (    
  20.     SELECT ROW_NUMBER() OVER(partition BY iencucod,duracion ORDER BY iencucod,duracion) AS rn, code,duracion,iencucod
  21.     FROM #temp
  22.     WHERE
  23.     CONVERT(VARCHAR(20),duracion) + '#' + CONVERT(VARCHAR(20),iencucod)  IN
  24.     (
  25.      
  26.  
  27.         SELECT CONVERT(VARCHAR(20),MAX(duracion)) + '#' + CONVERT(VARCHAR(20),iencucod) AS cadena FROM #temp GROUP BY iencucod
  28.  
  29.      
  30.     )
  31. ) t2 WHERE rn=1

No habias aclarado ese punto prueba este codigo y comentas :)

Saludos!
Alguna alternativa al row_number() over... me salta el siguiente mensaje: "'row_number' is not a recognized function name", será porque estoy usando la versión express de sql server 2008?
  #9 (permalink)  
Antiguo 09/08/2011, 13:08
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: algo más que eliminar duplicados en sql server

Este codigo, ya fue probado:

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
__________________
MCTS Isaias Islas
  #10 (permalink)  
Antiguo 09/08/2011, 13:50
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: algo más que eliminar duplicados en sql server

Cita:
Iniciado por iislas Ver Mensaje
Este codigo, ya fue probado:

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
Esas common table expresion me encantan, lo malo es que todavia no se utilizarlas bien jejejej
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #11 (permalink)  
Antiguo 09/08/2011, 14:22
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: algo más que eliminar duplicados en sql server

A fuerza de aplicarlas en los proyectos, seran como un vil SELECT el dia de mañana.....Saludos
__________________
MCTS Isaias Islas

Etiquetas: duplicados, select, server, sql, tabla, campos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:19.