Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

174
Vistas
eliminar condicionalmente los duplicados de la base de datos en postgres

Me gustaría eliminar los duplicados de la columna 'valor', pero solo si no hubo cambios con respecto a la actualización anterior. Leí tutoriales sobre retraso y adelanto, pero no pude encontrar un ejemplo con la eliminación de duplicados.

Original:

 +----+-------+-------+------------------------+ | ID | subID | value | updated_at | +----+-------+-------+------------------------+ | 1 | 2 | 2.20 | 2020-02-16 07:36:25+01 | | 1 | 2 | 2.20 | 2020-02-16 07:31:25+01 | | 1 | 2 | 2.20 | 2020-02-16 07:26:25+01 | | 1 | 2 | 2.30 | 2020-02-16 07:21:25+01 | | 1 | 2 | 2.20 | 2020-02-16 07:16:25+01 | | 1 | 2 | 2.20 | 2020-02-16 07:11:25+01 | +----+-------+-------+------------------------+

Salida deseada:

 +----+-------+-------+------------------------+ | ID | subID | value | updated_at | +----+-------+-------+------------------------+ | 1 | 2 | 2.20 | 2020-02-16 07:36:25+01 | | 1 | 2 | 2.30 | 2020-02-16 07:21:25+01 | | 1 | 2 | 2.20 | 2020-02-16 07:16:25+01 | +----+-------+-------+------------------------+
over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Usaría lag o lead y eliminaría por ctid:

 DELETE FROM yourtable WHERE ctid IN ( SELECT ctid FROM ( SELECT ctid, value, LAG(value) OVER(PARTITION BY id, subid ORDER BY updated_at) pre FROM yourtable t ) t WHERE value = pre )

Al igual que con cualquier consulta de eliminación de Internet, ejecútela contra una copia de la tabla...

over 4 years ago · Santiago Trujillo Denunciar

0

Este es un problema de lagunas e islas. Si desea la última fila antes del cambio de valor de búsqueda, puede usar lead() :

 select * from ( select t.*, lead(value) over(partition by id, sub_id order by updated_at) next_value from mytable t ) t where value <> next_value or next_value is null

Por otro lado, si desea el primer valor después de cada cambio de valor, puede usar lag() en lugar de lead() (el resto de la consulta debe permanecer igual).

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda