Borrado de registros (2008-11-05)

05/11/2008 - 10:01 por Mauricio | Informe spam
Hola a todos,
tengo 2 tablas relacionadas 1 a M, ARCHIVOS e HISTORIA.
ARCHIVOS
|
|-->> HISTORIA

La tabla de HISTORIA está creciendo demasiado, así que quiero dejar
solo 20 registros de HISTORIA por cada ARCHIVO.
En la tabla HISTORIA tengo un ID, identity, y un campo FECHA. Cómo
sería la sentencia para borrar los registros y dejar los 20 más nuevos?
Muchas gracias desde ya.

Mauricio
Copenhague, Dinamarca

Preguntas similare

Leer las respuestas

#1 Carlos Sacristan
05/11/2008 - 11:12 | Informe spam
Si es SQL Server 2005 lo que tienes, puedes usar la función ROW_NUMBER() para
numerar los registros agrupando por archivo para luego borrar el resto. Algo
como

SELECT ROW_NUMBER() OVER(PARTITION BY archivo ORDER BY fecha) AS rn, *
FROM historia
ORDER BY rn, archivo

Para eliminar tan sólo tendrías que combinar esta select con tu delete,
filtrando por rn>20

"Mauricio" wrote:

Hola a todos,
tengo 2 tablas relacionadas 1 a M, ARCHIVOS e HISTORIA.
ARCHIVOS
|
|-->> HISTORIA

La tabla de HISTORIA está creciendo demasiado, así que quiero dejar
solo 20 registros de HISTORIA por cada ARCHIVO.
En la tabla HISTORIA tengo un ID, identity, y un campo FECHA. Cómo
sería la sentencia para borrar los registros y dejar los 20 más nuevos?
Muchas gracias desde ya.

Mauricio
Copenhague, Dinamarca



Respuesta Responder a este mensaje
#2 Alejandro Mesa
05/11/2008 - 13:31 | Informe spam
Carlos,

De acuerdo, solo que debemos cambiar el ordenamiento a que sea DESC para
dejar las 20 filas mas recientes por archivo.

;with r_set
as
(
SELECT
[id],
archivo,
fecha,
ROW_NUMBER() OVER(PARTITION BY archivo ORDER BY fecha DESC) AS rn
FROM
historia
)
delete r_set
where rn > 20;
GO


AMB


"Carlos Sacristan" wrote:

Si es SQL Server 2005 lo que tienes, puedes usar la función ROW_NUMBER() para
numerar los registros agrupando por archivo para luego borrar el resto. Algo
como

SELECT ROW_NUMBER() OVER(PARTITION BY archivo ORDER BY fecha) AS rn, *
FROM historia
ORDER BY rn, archivo

Para eliminar tan sólo tendrías que combinar esta select con tu delete,
filtrando por rn>20

"Mauricio" wrote:

> Hola a todos,
> tengo 2 tablas relacionadas 1 a M, ARCHIVOS e HISTORIA.
> ARCHIVOS
> |
> |-->> HISTORIA
>
> La tabla de HISTORIA está creciendo demasiado, así que quiero dejar
> solo 20 registros de HISTORIA por cada ARCHIVO.
> En la tabla HISTORIA tengo un ID, identity, y un campo FECHA. Cómo
> sería la sentencia para borrar los registros y dejar los 20 más nuevos?
> Muchas gracias desde ya.
>
> Mauricio
> Copenhague, Dinamarca
>
>
>
Respuesta Responder a este mensaje
#3 Carlos Sacristan
05/11/2008 - 17:07 | Informe spam
Cierto, se me pasó lo de "los más nuevos"

Gracias por la puntualización, Alejandro

"Alejandro Mesa" wrote:

Carlos,

De acuerdo, solo que debemos cambiar el ordenamiento a que sea DESC para
dejar las 20 filas mas recientes por archivo.

;with r_set
as
(
SELECT
[id],
archivo,
fecha,
ROW_NUMBER() OVER(PARTITION BY archivo ORDER BY fecha DESC) AS rn
FROM
historia
)
delete r_set
where rn > 20;
GO


AMB


"Carlos Sacristan" wrote:

> Si es SQL Server 2005 lo que tienes, puedes usar la función ROW_NUMBER() para
> numerar los registros agrupando por archivo para luego borrar el resto. Algo
> como
>
> SELECT ROW_NUMBER() OVER(PARTITION BY archivo ORDER BY fecha) AS rn, *
> FROM historia
> ORDER BY rn, archivo
>
> Para eliminar tan sólo tendrías que combinar esta select con tu delete,
> filtrando por rn>20
>
> "Mauricio" wrote:
>
> > Hola a todos,
> > tengo 2 tablas relacionadas 1 a M, ARCHIVOS e HISTORIA.
> > ARCHIVOS
> > |
> > |-->> HISTORIA
> >
> > La tabla de HISTORIA está creciendo demasiado, así que quiero dejar
> > solo 20 registros de HISTORIA por cada ARCHIVO.
> > En la tabla HISTORIA tengo un ID, identity, y un campo FECHA. Cómo
> > sería la sentencia para borrar los registros y dejar los 20 más nuevos?
> > Muchas gracias desde ya.
> >
> > Mauricio
> > Copenhague, Dinamarca
> >
> >
> >
Respuesta Responder a este mensaje
#4 Alejandro Mesa
05/11/2008 - 19:16 | Informe spam
Carlos,

No hay de que. El comentario es para evitar que Mauricio hiciera la pregunta
despues de ver que los resultados no eran los esperados.

Saludos,
AMB

"Carlos Sacristan" wrote:

Cierto, se me pasó lo de "los más nuevos"

Gracias por la puntualización, Alejandro

"Alejandro Mesa" wrote:

> Carlos,
>
> De acuerdo, solo que debemos cambiar el ordenamiento a que sea DESC para
> dejar las 20 filas mas recientes por archivo.
>
> ;with r_set
> as
> (
> SELECT
> [id],
> archivo,
> fecha,
> ROW_NUMBER() OVER(PARTITION BY archivo ORDER BY fecha DESC) AS rn
> FROM
> historia
> )
> delete r_set
> where rn > 20;
> GO
>
>
> AMB
>
>
> "Carlos Sacristan" wrote:
>
> > Si es SQL Server 2005 lo que tienes, puedes usar la función ROW_NUMBER() para
> > numerar los registros agrupando por archivo para luego borrar el resto. Algo
> > como
> >
> > SELECT ROW_NUMBER() OVER(PARTITION BY archivo ORDER BY fecha) AS rn, *
> > FROM historia
> > ORDER BY rn, archivo
> >
> > Para eliminar tan sólo tendrías que combinar esta select con tu delete,
> > filtrando por rn>20
> >
> > "Mauricio" wrote:
> >
> > > Hola a todos,
> > > tengo 2 tablas relacionadas 1 a M, ARCHIVOS e HISTORIA.
> > > ARCHIVOS
> > > |
> > > |-->> HISTORIA
> > >
> > > La tabla de HISTORIA está creciendo demasiado, así que quiero dejar
> > > solo 20 registros de HISTORIA por cada ARCHIVO.
> > > En la tabla HISTORIA tengo un ID, identity, y un campo FECHA. Cómo
> > > sería la sentencia para borrar los registros y dejar los 20 más nuevos?
> > > Muchas gracias desde ya.
> > >
> > > Mauricio
> > > Copenhague, Dinamarca
> > >
> > >
> > >
Respuesta Responder a este mensaje
#5 Mauricio
05/11/2008 - 22:12 | Informe spam
Muchas gracias a ambos!!! :)

Il se trouve que Alejandro Mesa a formulé :
Carlos,

No hay de que. El comentario es para evitar que Mauricio hiciera la pregunta
despues de ver que los resultados no eran los esperados.

Saludos,
AMB

"Carlos Sacristan" wrote:

Cierto, se me pasó lo de "los más nuevos"

Gracias por la puntualización, Alejandro

"Alejandro Mesa" wrote:

Carlos,

De acuerdo, solo que debemos cambiar el ordenamiento a que sea DESC para
dejar las 20 filas mas recientes por archivo.

;with r_set
as
(
SELECT
[id],
archivo,
fecha,
ROW_NUMBER() OVER(PARTITION BY archivo ORDER BY fecha DESC) AS rn
FROM
historia
)
delete r_set
where rn > 20;
GO


AMB


"Carlos Sacristan" wrote:

Si es SQL Server 2005 lo que tienes, puedes usar la función ROW_NUMBER()
para numerar los registros agrupando por archivo para luego borrar el
resto. Algo como

SELECT ROW_NUMBER() OVER(PARTITION BY archivo ORDER BY fecha) AS rn, *
FROM historia
ORDER BY rn, archivo

Para eliminar tan sólo tendrías que combinar esta select con tu delete,
filtrando por rn>20

"Mauricio" wrote:

Hola a todos,
tengo 2 tablas relacionadas 1 a M, ARCHIVOS e HISTORIA.
ARCHIVOS
|
|-->> HISTORIA

La tabla de HISTORIA está creciendo demasiado, así que quiero dejar
solo 20 registros de HISTORIA por cada ARCHIVO.
En la tabla HISTORIA tengo un ID, identity, y un campo FECHA. Cómo
sería la sentencia para borrar los registros y dejar los 20 más nuevos?
Muchas gracias desde ya.

Mauricio
Copenhague, Dinamarca














Mauricio
Copenhague, Dinamarca
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida