SQL - Dividir una columna en dos teniendo en cuenta valor de otra columna t/sql

 
Vista:
sin imagen de perfil
Val: 5
Ha aumentado su posición en 17 puestos en SQL (en relación al último mes)
Gráfica de SQL

Dividir una columna en dos teniendo en cuenta valor de otra columna t/sql

Publicado por Galatea (2 intervenciones) el 01/08/2020 17:35:10
Hola!

Quisiera saber si alguien sabe como hacer para separar una columna que tiene fechas de estados activo e inactivo de un dispositivo. El problema está en que hay fechas donde no hubo cambio en el estado del dispositivo, simplemente hubo alguna modificacion sobre el mismo, pero no afectó su estado. Necesito separar las fechas en que el dispositivo cambió de estado para obtener la fecha inicial y final de cada estado.
He tratado, para obtener la fecha final, haciendo join a la misma tabla y usando un CASE WHEN, pero finalmente de alguna manera tengo que tener en cuenta que la fecha que no tiene cambio de estado no deberia ser tenida en cuenta y no tengo idea de como hacer eso.

Este es un ejemplo de lo que hasta ahora he tratado de hacer y solo llego a poner la fecha mayor frente a la menor, pero no tengo idea como hacer para que solo tome las fechas en las que hubo modificación de estado y que finalmente me deje como fecha inicial fecha en la que quedó activo el dispositivo y al frente de esta la fecha 31/12/9999:

SELECT
t1.IdDispo,
t1.IdEstado,
t1.Fecha as FechaInicial,
CASE WHEN t2.fecha > t2.fecha THEN t2.fecha ELSE '31/12/9999' END AS FechaFinal
FROM
tablaEstados t1 inner join tablaEstados t2 on t1.IdDispo = t2.idDispo

Agradezco a quien me pueda ayudar diciendome cómo podría acercarme al resultado. Es necesario que la solucion se adapte a T/SQL pues el desarrollo es en Databricks

Datos_Originales
ResultadoDeseado
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias
Val: 2.542
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Dividir una columna en dos teniendo en cuenta valor de otra columna t/sql

Publicado por Isaias (1921 intervenciones) el 01/08/2020 21:04:36
Por principio de cuentas, ¿Que motor de base de datos manejas?, ¿Como sabes que hubo un cambio de ESTADO?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 5
Ha aumentado su posición en 17 puestos en SQL (en relación al último mes)
Gráfica de SQL

Dividir una columna en dos teniendo en cuenta valor de otra columna t/sql

Publicado por Galatea (2 intervenciones) el 01/08/2020 22:29:23
Hola! Antes que nada gracias por tu interés a mi pregunta.
El motor de base de datos es Azure Databricks, por eso comenté que la solución debe ser compatible con t/sql pues es muy similar, tiene obviamente su lenguage nativo pero en general se puede adaptar bien funciones usadas en t/sql al ser de Microsoft.
En cuanto a cómo se sabe el cambio de estado, este es determinado por el campo Activo (X = Activo, Null = Inactivo), pero sucede que puede haber algun otro tipo de modificacion que afecte al dispositivo o simplemente un error en los datos de origen, que no corresponden a un cambio de estado pero si agregan un registro como si hubiese habido una modificacion, es por eso que en la primera imagen que adjunté aparecen registros con diferente fecha pero sin modificaciones en el campo Activo. El resultado final debe ser obtener solo los registros donde se vea que el dispositivo cambio de estado evidenciando la fecha de dicha modificacion.
En la 2a imagen aparece que su estado inicial (para este caso Inactivo) corresponde a la fecha 1/12/10 y la primera modificación válida del estado es el 6/5/12, es por eso que en el primer registro queda como fecha inicial 1/12/10 y su respectiva fecha final 6/5/12. Siendo así, el segundo registro si no hubiera más historial después de esta última fecha debería ser: fecha inicial 6/5/12 fechafinal 31/12/9999, pero como hay otra registro histórico de cambio que sucedió el 12/12/2013, pues el segundo registro debe quedar con: fechafinal 12/12/2013 y el ultimo registro para este caso debe indicar que no hay fecha final conocida, por esto el 31/12/9999, pues el cambio de estado más reciente corresponde a su ultima fecha inicial.

Perdón por extenderme en la explicación, pero espero haber sido clara con la respuesta a tu pregunta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar