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 | +----+-------+-------+------------------------+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...
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).