Descartar registros que se repiten consecutivamente

11/05/2010 - 14:14 por José Antonio Muñoz | Informe spam
Hola al grupo,

¿como puedo descartar los registros en una consulta donde el valor de uno de
los campos se repite de manera consecutiva ordenando la consulta por un
campo clave?

Ejemplo: En la consulta siguiente el registro cuyo código 3 se descarta ya
que se repite del valor anterior.

Codigo Fecha
1 12/01/2009
2 03/03/2009
3 03/03/2009
4 01/05/2009
5 03/03/2009


Nota: No me sirve la siguiente consulta ya que cuando la tabla tiene muchos
registros (sobre 200.000) tarda demasiado.

SELECT Codigo, Fecha FROM
(SELECT Codigo, Fecha, CASE WHEN (SELECT TOP 1 Fecha FROM Tabla WHERE
Codigo<xx.Codigo ORDER BY Codigo Desc)=Fecha THEN 1 ELSE 0 END As Repite
FROM Tabla As xx) As TablaInterna
WHERE Repite=0

saludos,
José Antonio

Preguntas similare

Leer las respuestas

#6 Jose Antonio
12/05/2010 - 15:48 | Informe spam
Si los codigos son consecutivos y no hay ningun salto funciona
perfectamente, pero si hay saltos no funciona.

"L. Garcia" escribió en el mensaje de
noticias:hsdv4l$hst$
Hola, yo probaria esta consulta:

Select T1.Codigo, T1.Fecha
From <Tabla> AS T1
Left Join <Tabla> AS T2 ON T2.Codigo = T1.Codigo-1 AND T2.Fecha =
T1.Fecha
Where T2.Codigo IS NULL

Si tienes el campo Codigo como PK o Indice, tiene que ir como un tiro, y
sino, tampoco creo que se demore mucho.

Ya diras si te sirve.

Saludos

PD: Una variantes de esta consulta sirve para buscar 'huecos' en campos
con números consecutivos ;-)


"José Antonio Muñoz" escribió en el mensaje
news:%
Hola al grupo,

¿como puedo descartar los registros en una consulta donde el valor de uno
de los campos se repite de manera consecutiva ordenando la consulta por
un campo clave?

Ejemplo: En la consulta siguiente el registro cuyo código 3 se descarta
ya que se repite del valor anterior.

Codigo Fecha
1 12/01/2009
2 03/03/2009
3 03/03/2009
4 01/05/2009
5 03/03/2009


Nota: No me sirve la siguiente consulta ya que cuando la tabla tiene
muchos registros (sobre 200.000) tarda demasiado.

SELECT Codigo, Fecha FROM
(SELECT Codigo, Fecha, CASE WHEN (SELECT TOP 1 Fecha FROM Tabla WHERE
Codigo<xx.Codigo ORDER BY Codigo Desc)=Fecha THEN 1 ELSE 0 END As Repite
FROM Tabla As xx) As TablaInterna
WHERE Repite=0

saludos,
José Antonio





Respuesta Responder a este mensaje
#7 Jose Antonio
12/05/2010 - 15:50 | Informe spam
Esta con tu consulta funciona correctamente, siempre que en tu tabla codigo
no sea clave primaria.

//Con vairable tabla
declare @p table (codigo int primary key, fecha date)

insert @p select codigo,fecha from tabla

tu consulta sobre tabla


"Jose Antonio" escribió en el mensaje de
noticias:
Si tu tabla tiene como primay key el codigo la consulta que describes es
mas o menos eficiente y yo creo que te va a ser imposible mejorarla.

Si codigo no es la clave primaria y o no puedes crearla
puedes probar otra alternativa en el escenario que tengas, pero yo creo
que no deben de ser mas eficientes que tu consulta.

prueba esta para ver como te va

//Con vairable tabla
declare @p table (codigo int, fecha date, marca int primary key)

insert @p select codigo,fecha,ROW_NUMBER() over (order by codigo) from
prueba

select l.codigo,l.fecha from @p l where l.fecha<>(select fecha from @p
where marca=l.marca-1) or l.marca=1
order by l.codigo;



"José Antonio Muñoz" escribió en el mensaje de
noticias:#
Hola al grupo,

¿como puedo descartar los registros en una consulta donde el valor de uno
de los campos se repite de manera consecutiva ordenando la consulta por
un campo clave?

Ejemplo: En la consulta siguiente el registro cuyo código 3 se descarta
ya que se repite del valor anterior.

Codigo Fecha
1 12/01/2009
2 03/03/2009
3 03/03/2009
4 01/05/2009
5 03/03/2009


Nota: No me sirve la siguiente consulta ya que cuando la tabla tiene
muchos registros (sobre 200.000) tarda demasiado.

SELECT Codigo, Fecha FROM
(SELECT Codigo, Fecha, CASE WHEN (SELECT TOP 1 Fecha FROM Tabla WHERE
Codigo<xx.Codigo ORDER BY Codigo Desc)=Fecha THEN 1 ELSE 0 END As Repite
FROM Tabla As xx) As TablaInterna
WHERE Repite=0

saludos,
José Antonio

Respuesta Responder a este mensaje
#8 Alejandro Mesa
12/05/2010 - 17:40 | Informe spam
José Antonio Muñoz,

Puedes usar una funcion de rango para calcular un grupo comun de filas
consecutivas que tienen la misma fecha.

DECLARE @T TABLE (
Codigo int,
Fecha datetime
);

INSERT INTO @T VALUES(1, '12/01/2009');
INSERT INTO @T VALUES(2, '03/03/2009');
INSERT INTO @T VALUES(3, '03/03/2009');
INSERT INTO @T VALUES(4, '01/05/2009');
INSERT INTO @T VALUES(5, '03/03/2009');

WITH r_set AS (
SELECT
Codigo,
Fecha,
Codigo - ROW_NUMBER() OVER(PARTITION BY Fecha ORDER BY Codigo) AS grp
FROM
@T
)
SELECT Fecha, MIN(Codigo) AS Codigo
FROM r_set
GROUP BY grp, Fecha
ORDER BY Codigo;
GO

Veamos el ejemplo de los codigos 2 y 3.

2 '03/03/2009' (2 - 1) = 1
3 '03/03/2009' (3 - 2) = 1

El menos codigo para el grp = 1 es 2, asi que la fila que se retornara es la
del codigo 2.

Los valores usados en la resta (1 y 2) provienen de la funcion row_number
que asigna un valor, en este caso para cada grupo con la misma fecha pero
ordenando los mienbros del grupo por el valor de codigo.

2 '03/03/2009' --> 1
3 '03/03/2009' --> 2
5 '03/03/2009' --> 3

estas filas consecutivas se conocen como islas, y puedes leer sobre este
metodo para encontrar islas en el ultimo libro de Itzik Ben-Gan sobre "T-SQL
Querying".

Inside Microsoft SQL Server 2008: T-SQL Queryin
http://www.amazon.com/Inside-Micros...y_b_text_b


AMB


"José Antonio Muñoz" wrote:

Hola al grupo,

¿como puedo descartar los registros en una consulta donde el valor de uno de
los campos se repite de manera consecutiva ordenando la consulta por un
campo clave?

Ejemplo: En la consulta siguiente el registro cuyo código 3 se descarta ya
que se repite del valor anterior.

Codigo Fecha
1 12/01/2009
2 03/03/2009
3 03/03/2009
4 01/05/2009
5 03/03/2009


Nota: No me sirve la siguiente consulta ya que cuando la tabla tiene muchos
registros (sobre 200.000) tarda demasiado.

SELECT Codigo, Fecha FROM
(SELECT Codigo, Fecha, CASE WHEN (SELECT TOP 1 Fecha FROM Tabla WHERE
Codigo<xx.Codigo ORDER BY Codigo Desc)=Fecha THEN 1 ELSE 0 END As Repite
FROM Tabla As xx) As TablaInterna
WHERE Repite=0

saludos,
José Antonio

.

Respuesta Responder a este mensaje
#9 José Antonio Muñoz
14/05/2010 - 09:46 | Informe spam
Gracias por vuestra colaboración, al final me quedo con la solución de
Alejandro Mesa que resulta ser la más rápida.

saludos,
José Antonio Muñoz

"José Antonio Muñoz" escribió en el mensaje de
noticias news:%
Hola al grupo,

¿como puedo descartar los registros en una consulta donde el valor de uno
de los campos se repite de manera consecutiva ordenando la consulta por un
campo clave?

Ejemplo: En la consulta siguiente el registro cuyo código 3 se descarta
ya que se repite del valor anterior.

Codigo Fecha
1 12/01/2009
2 03/03/2009
3 03/03/2009
4 01/05/2009
5 03/03/2009


Nota: No me sirve la siguiente consulta ya que cuando la tabla tiene
muchos registros (sobre 200.000) tarda demasiado.

SELECT Codigo, Fecha FROM
(SELECT Codigo, Fecha, CASE WHEN (SELECT TOP 1 Fecha FROM Tabla WHERE
Codigo<xx.Codigo ORDER BY Codigo Desc)=Fecha THEN 1 ELSE 0 END As Repite
FROM Tabla As xx) As TablaInterna
WHERE Repite=0

saludos,
José Antonio

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida