es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

PostgreSQL, elimina los valores de una tabla que coincidan con la salida de una consulta en la misma tabla de donde se están eliminando los valores.

Estoy capturando datos de una base de datos todos los días, ejecutando una instrucción de inserción usando una consulta y los valores correspondientes a la fecha actual cuando se ejecuta la consulta.

Para evitar que la tabla se vuelva demasiado grande, quiero eliminar cualquier valor donde la combinación de un “ID” y un “Estado” sea igual que el día anterior.

Mi tabla tiene la siguiente estructura:
|Fecha|Email|Estado|

delete from tabla sct
using
(
select "Email", min("Fecha") as "Primera Fecha del Estado", "Estado" from tabla sct
group by "Email", "Estado"
) as t1
where sct."Email" = t1."Email" and sct."Fecha" = t1."Primera Fecha del Estado" and sct."Estado" = t1."Estado"
and t1."Primera Fecha del Estado" is null

Como solo quiero capturar la primera fecha en la que cambia un estado, quiero eliminar todas las filas donde el valor de “Primera Fecha del Estado” sea nulo.

Pero cuando ejecuto esta instrucción, ninguna de las filas en la tabla original se elimina.

Cualquier comentario sobre cómo corregir esta instrucción o un método alternativo para resolver este problema sería muy apreciado.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que la consulta actual está intentando eliminar filas donde el valor de “First Date of Status” es nulo, lo cual potencialmente podría ser ninguna ya que la subconsulta está usando una función “min”. En cambio, la consulta debería modificarse para eliminar las filas donde la combinación de ID y Estado sea la misma que la del día anterior, independientemente del valor de “First Date of Status”.

    Una posible solución es crear una tabla temporal que contenga los valores de ID y Estado de los datos del día anterior, y luego usarla para filtrar las filas a eliminar:

    CREATE TEMPORARY TABLE prev_data AS
    SELECT "Email", "Status"
    FROM tabla
    WHERE "Date" = CURRENT_DATE - INTERVAL '1 day';
    
    DELETE FROM tabla
    WHERE ("Email", "Status") IN (SELECT "Email", "Status" FROM prev_data);
    

    Esto creará una tabla temporal llamada “prev_data” que contendrá los valores de ID y Estado de los datos del día anterior. Luego usamos la cláusula “IN” para eliminar solo aquellas filas de la tabla original donde los valores de ID y Estado coincidan con alguna fila de “prev_data”.

Comments are closed.