none
Acomodo de ciclos RRS feed

  • Pregunta

  • Que tal anteriormente me han ayudado a solucionar varios casos de ciclos entre contar los el inicio y fin de 0 o el principio y fin del 1, pero ahora tengo un caso que he estado arrastrando por meses, habia pasado no muy a menudo pero ahora se a estado pasando muy frecuente, bueno les cuentos en anteriores preguntas han estado viendo algo como esto:

    Ultimamente no me ha estado ordenando bien que es ordenar bien que despues de un 1 debe de ver 0 que lo respalde con la misma fecha y hora, tomando ejemplo la imagen anterior el ciclo comienza 2019-11-27 00:37:32 a 2019-11-27  01:07:08,

    si hay un 1 dentro ciclo y ciclo no pasa nada como vemos en el caso siguiente que empieza de 2019-11-27 01:08:50  y termina 2019-11-27 02:08:52  y hay uno 1 a las 2019-11-27 02:00:25

    aqui viene el problema no he podido resolver estos casos ejemplo

    No deberia Ordenarlo de esa manera ya que 2019-11-25 00:59:38 solo tiene 1 y no tiene un 0 que lo respalde con la misma fecha y hora, estos caso que les muestro son casos muy esporádicos pero si perjudican la operación. Debe de quedar de la siguiente manera 

     

    Mi query es el siguinte

    Todos son numeros enteros , a excepción del timestamp que es datetime 



    Pregunta

    jueves, 5 de diciembre de 2019 23:06

Respuestas

  • Hola Dave2203:

    Has visto la solución que te ha propuesto Hacerdan en la otra pregunta. Utilizar una variable de tabla con un campo identity para que sea la insercción en esta variable de tabla la que te de el orden.

    https://social.technet.microsoft.com/Forums/es-ES/81ed2ebe-3faf-4e52-a3ec-ea7d2afe2461/inicio-y-fin-de-un-ciclo?forum=sqlserveres

    viernes, 6 de diciembre de 2019 7:52
  • Si efectivamente , ya lo mire eso me sirviria para otra cosas pero lo que expuse es el proceso antes de las preguntas que he estado haciendo, Esta pregunta se basa en el antes de como se muestra en la imagen que acon tinuacion voy a poner, no se si me explico los datos los traigo desordenados y luegos los ordeno para que salgan de la siguiente manera  

    Es un ordenamiento correcto 

     

    Y este es un ordenamiento malo

    Ese ordenamiento es malo ya que debe de ver si el 2019-11-25 00:59:38 tiene un 0 que lo respalde para que quede esa manera que salga lo consiguiente el orden debe de ser

    Value     timestamp

    1        2019-11-25 00:37:41

    0        2019-11-25 00:59:38

    1        2019-11-25 00:59:38

    Lo que expongo es que de un tiempo para aca anda haciendo el ordenamiento mal , por eso puse el codigo que tengo para ver si me pueden guiar de como hacerle o si hay otra forma de ordenarlo .

    de antemano gracias por sus respuestas 


    Pregunta

    viernes, 6 de diciembre de 2019 15:50
  • Hola Dave2203:

    Entiendo que hayas participado en muchas preguntas, con muchos ejemplos diferentes, pero los que puedan ver este hilo, no.

    Si no te importa, restringe los ejemplos a tu pregunta y no mezcles datos de diferentes días, que son dificiles de seguir para alguien que no haya seguido los otros hilos.

    Si tu escenario es el que planteas en la pregunta de amarillo, primera del hilo, una solución al ordenamiento, es además de coger el siguiente registro para la fecha, coger el siguiente registro para el valor y con esto hacer un case.

    drop table if exists dbo.datos;
    create table dbo.datos (fecha datetime, columna int)
    go
    
    set language 'us_english'
    insert into dbo.datos (fecha, columna)
    values
    ('2019-11-27 00:00:24',0),
    ('2019-11-27 00:37:32',1),
    ('2019-11-27 00:37:32',0),
    ('2019-11-27 01:00:21',1),
    ('2019-11-27 01:07:08',1),
    ('2019-11-27 01:07:08',0),
    ('2019-11-27 01:08:50',0),
    ('2019-11-27 01:08:50',1),
    ('2019-11-27 02:00:25',1),
    ('2019-11-27 02:08:52',0),
    ('2019-11-27 02:08:52',1),
    ('2019-11-27 03:00:18',0),
    ('2019-11-27 04:00:34',0),
    ('2019-11-27 05:00:51',0),
    ('2019-11-27 06:00:11',0),
    ('2019-11-27 07:00:13',0),
    ('2019-11-27 07:53:48',0),
    ('2019-11-27 07:53:48',1);
    GO
    --

    Ya sabemos, que sql server, no ordena ni bien ni mal, simplemente no ordena los resultados, por tanto vamos a darle una vía explicita para ordenar.

    ;with R as (
    	SELECT fecha as res1, columna as res2, FECHA
    		, lead(fecha,1) over(order by (select null)) as fechaSig
    		, lag(fecha,1) over (order by (select null)) as fechaAnt
    		, columna
    		, lead(columna,1) over(order by (select null)) as colSig
    		, lag(columna, 1) over (order by(select null)) as colAnt
    	FROM dbo.datos
    	)
    	Select *,case 
    	-- caso 1
    				when fecha < fechaSig and fecha = fechaAnt and columna = 0 and colSig = 1 and colAnt = 1 then 2
    	-- caso 2
    			    when fecha < fechasig and fecha = fechaAnt and columna = 1 and colsig = 0 and colAnt = 0 then 2
    				  else 0 end p
    	 from R 
    		ORDER BY 
    		FECHA, p desc
    

    Si has observado los datos, he variado la fila de las 00:37:32 y la fila de las 02:08:52

    Una posible solución, es obtener lo que necesito para darle una ordenación que pueda tener una lógica que nos interese. En este caso, necesito saber, lo que tiene antes y despues, y lo que valía antes y despues (esto es evidente que lo puedes cambiar, pues yo solo me he referido a esta causística)

    Para poder ordenar los datos, solo le añado una columna donde yo puedo jugar con una expresión para darle una prioridad a la ordenación. Esta columna siempre actuará cuando la fecha sea igual, ya que es el primer condicionante del order by.

    En prinicipio he detectado dos casos que no cumplen el ordenamiento sugerido, (que casualidad, los dos que yo he desordenado :)  ) y a ellos, les aplico un resultado del case que me los coloca antes que el registro siguiente.

    Entonces, como todas estas columnas no se tienen porque ver, el resultado de la query podría ser.

    --
    ;with R as (
    	SELECT fecha as res1, columna as res2, FECHA
    		, lead(fecha,1) over(order by (select null)) as fechaSig
    		, lag(fecha,1) over (order by (select null)) as fechaAnt
    		, columna
    		, lead(columna,1) over(order by (select null)) as colSig
    		, lag(columna, 1) over (order by(select null)) as colAnt
    	FROM dbo.datos
    	), datosOrdenados As (
    	Select *,case 
    	-- caso 1
    				when fecha < fechaSig and fecha = fechaAnt and columna = 0 and colSig = 1 and colAnt = 1 then 2
    	-- caso 2
    			    when fecha < fechasig and fecha = fechaAnt and columna = 1 and colsig = 0 and colAnt = 0 then 2
    				  else 0 end colOrdenar
    	 from R 
    )
    Select d.res1 as [timestamp],
    		d.res2 as [value]
    		 from DatosOrdenados d
    		order by d.res1, d.colOrdenar desc

    Salida

    Es bastante probable y posible, que tengas que aumentar los casos de ordenación, pero es una manera fácil de poder decidir en que casos, uno va antes que otro.

    Espero te ayude

    sábado, 7 de diciembre de 2019 5:13

Todas las respuestas

  • Hola Dave2203:

    Has visto la solución que te ha propuesto Hacerdan en la otra pregunta. Utilizar una variable de tabla con un campo identity para que sea la insercción en esta variable de tabla la que te de el orden.

    https://social.technet.microsoft.com/Forums/es-ES/81ed2ebe-3faf-4e52-a3ec-ea7d2afe2461/inicio-y-fin-de-un-ciclo?forum=sqlserveres

    viernes, 6 de diciembre de 2019 7:52
  • Si efectivamente , ya lo mire eso me sirviria para otra cosas pero lo que expuse es el proceso antes de las preguntas que he estado haciendo, Esta pregunta se basa en el antes de como se muestra en la imagen que acon tinuacion voy a poner, no se si me explico los datos los traigo desordenados y luegos los ordeno para que salgan de la siguiente manera  

    Es un ordenamiento correcto 

     

    Y este es un ordenamiento malo

    Ese ordenamiento es malo ya que debe de ver si el 2019-11-25 00:59:38 tiene un 0 que lo respalde para que quede esa manera que salga lo consiguiente el orden debe de ser

    Value     timestamp

    1        2019-11-25 00:37:41

    0        2019-11-25 00:59:38

    1        2019-11-25 00:59:38

    Lo que expongo es que de un tiempo para aca anda haciendo el ordenamiento mal , por eso puse el codigo que tengo para ver si me pueden guiar de como hacerle o si hay otra forma de ordenarlo .

    de antemano gracias por sus respuestas 


    Pregunta

    viernes, 6 de diciembre de 2019 15:50
  • Hola Dave2203:

    Entiendo que hayas participado en muchas preguntas, con muchos ejemplos diferentes, pero los que puedan ver este hilo, no.

    Si no te importa, restringe los ejemplos a tu pregunta y no mezcles datos de diferentes días, que son dificiles de seguir para alguien que no haya seguido los otros hilos.

    Si tu escenario es el que planteas en la pregunta de amarillo, primera del hilo, una solución al ordenamiento, es además de coger el siguiente registro para la fecha, coger el siguiente registro para el valor y con esto hacer un case.

    drop table if exists dbo.datos;
    create table dbo.datos (fecha datetime, columna int)
    go
    
    set language 'us_english'
    insert into dbo.datos (fecha, columna)
    values
    ('2019-11-27 00:00:24',0),
    ('2019-11-27 00:37:32',1),
    ('2019-11-27 00:37:32',0),
    ('2019-11-27 01:00:21',1),
    ('2019-11-27 01:07:08',1),
    ('2019-11-27 01:07:08',0),
    ('2019-11-27 01:08:50',0),
    ('2019-11-27 01:08:50',1),
    ('2019-11-27 02:00:25',1),
    ('2019-11-27 02:08:52',0),
    ('2019-11-27 02:08:52',1),
    ('2019-11-27 03:00:18',0),
    ('2019-11-27 04:00:34',0),
    ('2019-11-27 05:00:51',0),
    ('2019-11-27 06:00:11',0),
    ('2019-11-27 07:00:13',0),
    ('2019-11-27 07:53:48',0),
    ('2019-11-27 07:53:48',1);
    GO
    --

    Ya sabemos, que sql server, no ordena ni bien ni mal, simplemente no ordena los resultados, por tanto vamos a darle una vía explicita para ordenar.

    ;with R as (
    	SELECT fecha as res1, columna as res2, FECHA
    		, lead(fecha,1) over(order by (select null)) as fechaSig
    		, lag(fecha,1) over (order by (select null)) as fechaAnt
    		, columna
    		, lead(columna,1) over(order by (select null)) as colSig
    		, lag(columna, 1) over (order by(select null)) as colAnt
    	FROM dbo.datos
    	)
    	Select *,case 
    	-- caso 1
    				when fecha < fechaSig and fecha = fechaAnt and columna = 0 and colSig = 1 and colAnt = 1 then 2
    	-- caso 2
    			    when fecha < fechasig and fecha = fechaAnt and columna = 1 and colsig = 0 and colAnt = 0 then 2
    				  else 0 end p
    	 from R 
    		ORDER BY 
    		FECHA, p desc
    

    Si has observado los datos, he variado la fila de las 00:37:32 y la fila de las 02:08:52

    Una posible solución, es obtener lo que necesito para darle una ordenación que pueda tener una lógica que nos interese. En este caso, necesito saber, lo que tiene antes y despues, y lo que valía antes y despues (esto es evidente que lo puedes cambiar, pues yo solo me he referido a esta causística)

    Para poder ordenar los datos, solo le añado una columna donde yo puedo jugar con una expresión para darle una prioridad a la ordenación. Esta columna siempre actuará cuando la fecha sea igual, ya que es el primer condicionante del order by.

    En prinicipio he detectado dos casos que no cumplen el ordenamiento sugerido, (que casualidad, los dos que yo he desordenado :)  ) y a ellos, les aplico un resultado del case que me los coloca antes que el registro siguiente.

    Entonces, como todas estas columnas no se tienen porque ver, el resultado de la query podría ser.

    --
    ;with R as (
    	SELECT fecha as res1, columna as res2, FECHA
    		, lead(fecha,1) over(order by (select null)) as fechaSig
    		, lag(fecha,1) over (order by (select null)) as fechaAnt
    		, columna
    		, lead(columna,1) over(order by (select null)) as colSig
    		, lag(columna, 1) over (order by(select null)) as colAnt
    	FROM dbo.datos
    	), datosOrdenados As (
    	Select *,case 
    	-- caso 1
    				when fecha < fechaSig and fecha = fechaAnt and columna = 0 and colSig = 1 and colAnt = 1 then 2
    	-- caso 2
    			    when fecha < fechasig and fecha = fechaAnt and columna = 1 and colsig = 0 and colAnt = 0 then 2
    				  else 0 end colOrdenar
    	 from R 
    )
    Select d.res1 as [timestamp],
    		d.res2 as [value]
    		 from DatosOrdenados d
    		order by d.res1, d.colOrdenar desc

    Salida

    Es bastante probable y posible, que tengas que aumentar los casos de ordenación, pero es una manera fácil de poder decidir en que casos, uno va antes que otro.

    Espero te ayude

    sábado, 7 de diciembre de 2019 5:13