Estoy tratando de escribir una consulta para rastrear los cambios de una columna booleana en una tabla. La mesa se ve así
ClientHistory ------------------------------------------------------------- | id | client_id | client_name | is_active | Timestamp | ------------------------------------------------------------- | 1 | 1 |Example Client| True | 06/15/2020| ------------------------------------------------------------- | 2 | 1 |Client Change | True | 06/16/2020| ------------------------------------------------------------- | 3 | 1 |Client Change | False | 06/17/2020 |Entonces, lo que querría es la fila 3 donde is_active cambió a falso. Luego, después de eso, querría la siguiente fila donde cambió a verdadero nuevamente.
Esto es lo que probé:
SELECT a.* FROM client_history AS a WHERE a.is_active <> ( SELECT b.is_active FROM client_history AS b WHERE a.client_id = b.client_id AND a.timestamp > b.timestamp ORDER BY b.timestamp DESC LIMIT 1 )Entonces, la subconsulta está tratando de obtener la fila anterior del mismo client_id al obtener la marca de tiempo más reciente antes. Luego, en la consulta, verifique si is_active no es igual a is_active de la fila anterior. Pero esto no está funcionando como estaba previsto. Espero que, al activar activo/inactivo, debería estar alternando en esta consulta, pero no es así. ¿Alguien tiene algún consejo?
¡Usa las funciones de la ventana!
select ch.* from (select ch.*, lag(is_active) over (partition by client_id order by timestamp) as prev_is_active from client_history ch ) ch where is_active <> prev_is_active;