valores una tabla seleccionar registros registro primer postgres obtener maximos grupo eliminar ejemplo delete cascada cada sql postgresql

una - seleccionar el primer registro de cada grupo sql



¿Cómo elimino un número fijo de filas con clasificación en PostgreSQL? (6)

Estoy tratando de portar algunas consultas MySQL antiguas a PostgreSQL, pero estoy teniendo problemas con esta:

DELETE FROM logtable ORDER BY timestamp LIMIT 10;

PostgreSQL no permite ordenamientos ni límites en su sintaxis de eliminación, y la tabla no tiene una clave principal, por lo que no puedo usar una subconsulta. Además, quiero preservar el comportamiento donde la consulta elimina exactamente el número o los registros dados; por ejemplo, si la tabla contiene 30 filas pero todas tienen la misma marca de tiempo, aún quiero eliminar 10, aunque no importa. que 10.

Asi que; ¿Cómo elimino un número fijo de filas con clasificación en PostgreSQL?

Editar: ninguna clave principal significa que no hay log_id columna log_id o similar. ¡Ah, las alegrías de los sistemas heredados!


Postgres recomienda utilizar matriz en lugar de IN y subconsulta. Esto debería funcionar mucho más rápido

DELETE FROM logtable WHERE id = any (array(SELECT id FROM logtable ORDER BY timestamp LIMIT 10));

Este y algunos otros trucos se pueden encontrar here


Puede escribir un procedimiento que pase por encima de la eliminación de líneas individuales, el procedimiento podría tomar un parámetro para especificar la cantidad de elementos que desea eliminar. Pero eso es un poco exagerado en comparación con MySQL.


Puedes intentar usar el ctid :

DELETE FROM logtable WHERE ctid IN ( SELECT ctid FROM logtable ORDER BY timestamp LIMIT 10 )

El ctid es:

La ubicación física de la versión de fila dentro de su tabla. Tenga en cuenta que aunque el ctid se puede usar para localizar la versión de la fila muy rápidamente, la ctid una fila cambiará si se actualiza o se mueve con VACUUM FULL . Por ctid tanto, ctid es inútil como identificador de fila a largo plazo.

También hay oid pero eso solo existe si lo pides específicamente cuando creas la tabla.


Si no tiene una clave principal, puede usar la matriz Where IN sintaxis con una clave compuesta.

delete from table1 where (schema,id,lac,cid) in (select schema,id,lac,cid from table1 where lac = 0 limit 1000);

Esto funcionó para mí.


Suponiendo que desea eliminar CUALQUIER 10 registros (sin el orden), puede hacer esto:

DELETE FROM logtable as t1 WHERE t1.ctid < (select t2.ctid from logtable as t2 where (Select count(*) from logtable t3 where t3.ctid < t2.ctid ) = 10 LIMIT 1);

Para mi caso de uso, eliminar 10M registros, esto resultó ser más rápido.


delete from logtable where log_id in ( select log_id from logtable order by timestamp limit 10);