/ / SQL: cómo eliminar filas de la tabla según un criterio: mysql, sql, sql-delete

SQL: cómo eliminar filas de la tabla en función de un criterio: mysql, sql, sql-delete

Tengo la siguiente tabla:

tbl
source    type    date
---       ---     ---
google    A       2010-02-25
google    A       2013-04-11
facebook  C       2008-10-22
facebook  C       2007-01-28

Quiero mantener solo una entrada de cada fuente, y el criterio es seleccionar la tupla de origen con min(date) group by source. La tabla consta de millones de registros, y estoy buscando una forma eficiente de eliminar registros redundantes.

Respuestas

2 para la respuesta № 1

En MySQL, puedes hacer esto usando un join:

delete t
from t join
(select source, min(date) as mindate
from t
group by source
) tt
on t.source = tt.source
where t.date > tt.mindate;

La única forma, de la mano, en la que puedo pensar para hacer esto más eficiente es almacenar el resultado de la agregación en una subconsulta y agregarle un índice.

También puedo agregar que independientemente del cálculo para determinar las filas a eliminar, eliminar muchas filas en una tabla ineficiente. Por lo general, recomendaría un enfoque de tres pasos:

  1. Escriba una consulta para generar la tabla que desea y almacene los resultados en una tabla temporal.
  2. Truncar la tabla original.
  3. Vuelva a insertar el número (mucho) más pequeño de filas.

0 para la respuesta № 2

En Microsoft SQL, puedes probar esto.

;
WITH cte
AS (SELECT ROW_NUMBER() OVER (PARTITION BY source, type
ORDER BY createdate) RN
FROM   tbsource)
DELETE FROM cte
WHERE  RN > 1;

0 para la respuesta № 3
delete from t where date not in (select al.d from (select min(date) as d  from t group by source )al);

0 para la respuesta № 4

Agregue una columna de identidad a la tabla duplicada como un número de serie que actúa como un identificador único de fila (auto ascendente incremental):

 alter table tbl add sno int identity(1,1)

mesa

Esta consulta selecciona solo filas no duplicadas con min (fecha):

(select min(date),sno From tbl group by source)

Entonces "sno" será igual a "1" y "4".

Ahora únase a esta tabla y elimine los registros de la unión que están duplicados (t.sno es nulo)

delete E from tbl E
left join
(select min(date),sno From tbl group by source) T on E.sno=T.sno
where T.sno is null

Tabla 3

Solución adaptada del método 3 de este enlace: ENLAZAR