none
Conteo de ciclos RRS feed

  • Pregunta

  • Buenas tardes

    He estado batallando casi todo el dia con este problema.

    como ven la imagen esta en amarillo unas fechas , el fin de un ciclo de un 0 a otro 0 es un ciclo , como le puedo hacer para contar esos ciclos 

    Como resultado quiero que me salga la fecha de inicio , fecha fin y valor , tengo el query de donde lo saco pero es bastante largo 


    Pregunta


    • Editado Dave2203 viernes, 18 de octubre de 2019 23:03
    viernes, 18 de octubre de 2019 23:02

Respuestas

  • Hola Dave2203:

    Entiendo que tu query tiene que sacar en la misma fila la 1ª fecha en amarillo, la 2ª fecha en amarillo y no me queda claro, a que te refieres con contar esos ciclos, pero te dejo una pequeña propuesta.

    ;with cte as (
    	Select 
    		row_number() over( order by fecha ) as row,
    		fecha,
    		ciclo
    	from ciclos
    	), NoOne as (
    	Select row,
    			fecha,
    			ciclo
    			from cte
    			where ciclo = 0
    	), valores AS (
    	Select 
    		row, 
    		LEAD(row,1)over(order by fecha) rowSig, 
    		fecha as inicioCiclo, 
    		lead(fecha,1)over(order by fecha) as finCiclo, 
    		ciclo 
    		from NoOne
    	)Select 
    		inicioCiclo, 
    		finCiclo,
    		ciclo,
    		rowsig-row as contador
    
    	from valores
    		where (row+1)<>rowSig

    Salida


    • Marcado como respuesta Dave2203 lunes, 21 de octubre de 2019 19:27
    sábado, 19 de octubre de 2019 7:33
  • lo que se espera obtener que dentro de un conjunto de datos , se obtenga una la cantidad de ciclos que hay , que me refiero con ciclos cuando pasa de un estado 0 pasando por 1 hasta llegar a otro cero, esto se utiliza para una grafica de onda cuadrada.

    Si la versión de SQL Server es 2012, o posterior, he aquí otro enfoque:

    -- código #3
    declare @FH1 datetime, @FH2 datetime;
    SELECT @FH1= min (FechaHora), @FH2= max (FechaHora)
      from #Evento;
    
    with Paso1 as (
    SELECT *,
           lead (Valor) over (order by Extra) as proxValor
      from #Evento
    )
    SELECT @FH1 as [FechaHora inicial], @FH2 as [FechaHora final],
           count(*) as Cantidad
      from Paso1
      where Valor = 0 and proxValor = 1;


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz domingo, 20 de octubre de 2019 17:57
    • Marcado como respuesta Dave2203 lunes, 21 de octubre de 2019 19:28
    domingo, 20 de octubre de 2019 17:55

Todas las respuestas

  • ¿La fecha y la hora de inicio de un ciclo es siempre la misma que la fecha y hora de cierre del ciclo anterior?

    ¿Los valores de la segunda columna son 0 o 1?

    Además de las dos columnas, ¿hay una tercera columna que indique la secuencia en que ocurren los eventos?


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    • Editado José Diz sábado, 19 de octubre de 2019 14:02
    sábado, 19 de octubre de 2019 1:00
  • Que tal jose 

    Respondiendo tus preguntas, Puede ser la misma fecha , pero con diferente hora y tiene una columna extra que es numero consecutivo.

    todos son 0 y 1 


    Pregunta


    • Editado Dave2203 sábado, 19 de octubre de 2019 2:03
    sábado, 19 de octubre de 2019 2:03
  • Hola Dave2203:

    Entiendo que tu query tiene que sacar en la misma fila la 1ª fecha en amarillo, la 2ª fecha en amarillo y no me queda claro, a que te refieres con contar esos ciclos, pero te dejo una pequeña propuesta.

    ;with cte as (
    	Select 
    		row_number() over( order by fecha ) as row,
    		fecha,
    		ciclo
    	from ciclos
    	), NoOne as (
    	Select row,
    			fecha,
    			ciclo
    			from cte
    			where ciclo = 0
    	), valores AS (
    	Select 
    		row, 
    		LEAD(row,1)over(order by fecha) rowSig, 
    		fecha as inicioCiclo, 
    		lead(fecha,1)over(order by fecha) as finCiclo, 
    		ciclo 
    		from NoOne
    	)Select 
    		inicioCiclo, 
    		finCiclo,
    		ciclo,
    		rowsig-row as contador
    
    	from valores
    		where (row+1)<>rowSig

    Salida


    • Marcado como respuesta Dave2203 lunes, 21 de octubre de 2019 19:27
    sábado, 19 de octubre de 2019 7:33
  • Respondiendo tus preguntas, Puede ser la misma fecha , pero con diferente hora y tiene una columna extra que es numero consecutivo.
    >todos son 0 y 1

    En el ejemplo hay horas repetidas.

    Teniendo en cuenta la muestra de datos que ha publicado, ¿cuál es el resultado esperado? Esto hará que sea más fácil entender lo que necesita.

    Propongo aquí un código SQL que cuenta como ciclos las secuencias repetidas de valores, ya sea 0 o 1.

      

    -- código #1 v2
    declare @UltProxExtra int;
    SELECT @UltProxExtra= (max (Extra) +1) from #Evento;
    
    with 
    Faixa as ( SELECT T1.Extra, T1.FechaHora, T1.Valor, (SELECT top (1) T2.Extra from #Evento as T2 where T2.Extra > T1.Extra and T2.Valor <> T1.Valor order by T2.Extra) as proxExtra from #Evento as T1 ) SELECT min (FechaHora) as [FechaHora inicial], max (FechaHora) as [FechaHora final], Valor, count(*) as Cantidad from Faixa
    group by coalesce (proxExtra, @UltProxExtra), Valor order by [FechaHora inicial];

    El código considera que su consulta genera una tabla temporal llamada #Evento.

    En código SQL la columna "Extra" es la que contiene la numeración secuencial y continua que usted reportó que existe.


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz sábado, 19 de octubre de 2019 18:59
    sábado, 19 de octubre de 2019 12:34
  • Que tal Javi

    Lo de contar ciclos es para una grafica de onda cuadrada y lo que me refiero con ciclos es cuando pasa de un estado 0 cero a otro estado 0 ese es un ciclo, es contar cuantos ciclos hay en una conjunto de datos

                                      1111                                                      111

    Aqui empieza    000000       0  aqui termina y continua  00000000      00

     Gracias por una solucion estare problandola 


    Pregunta

    sábado, 19 de octubre de 2019 15:16
  • que tal jose

    lo que se espera obtener que dentro de un conjunto de datos , se obtenga una la cantidad de ciclos que hay , que me refiero con ciclos cuando pasa de un estado 0 pasando por 1 hasta llegar a otro cero, esto se utiliza para una grafica de onda cuadrada.

    el resultado que se espera obtener es un tabla que tenga

    hora inicio del ciclo , hora fin de inicio y con eso porque la siguiente columna es la resta de las dos fechas


    Pregunta

    sábado, 19 de octubre de 2019 15:21
  •  

    Si desea saber cuántos ciclos se han ejecutado en un rango horario determinado, aquí tiene una sugerencia:

    -- código #2 v2
    declare @FH1 datetime, @FH2 datetime, @UltProxExtra int;
    SELECT @FH1= min (FechaHora), @FH2= max (FechaHora),
           @UltProxExtra= (max (Extra) +1)
      from #Evento;
    
    with 
    Paso1 as (
    SELECT T1.Extra, T1.Valor, 
           (SELECT top (1) T2.Extra 
              from #Evento as T2 
              where T2.Extra > T1.Extra
                    and T2.Valor <> T1.Valor
              order by T2.Extra) as proxExtra
      from #Evento as T1
    ),
    Paso2 as (
    SELECT min (Extra) as E1, max (Extra) as E2, Valor
      from Paso1
    group by coalesce (proxExtra, @UltProxExtra), Valor ) SELECT @FH1 as [FechaHora inicial], @FH2 as [FechaHora final], count(*) as Cantidad from Paso2 where Valor = 1;
     

    ---

    Duda: si en la última fila el valor es 1, ¿debe contarse el último ciclo (aún no cerrado)?
      


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz domingo, 20 de octubre de 2019 17:43
    sábado, 19 de octubre de 2019 19:33
  • Que tal jose 

    Si de hecho si el ultima fila es 1 se debe contar, porque puede empezar en 1 dia y terminar en otro, es por eso que se cuenta


    Pregunta

    domingo, 20 de octubre de 2019 17:31
  • Si de hecho si el ultima fila es 1 se debe contar, porque puede empezar en 1 dia y terminar en otro, es por eso que se cuenta

    Yo cambié el código #2 para considerar este caso especial.

    ¿Probaste el código 2?


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz domingo, 20 de octubre de 2019 17:57
    domingo, 20 de octubre de 2019 17:45
  • lo que se espera obtener que dentro de un conjunto de datos , se obtenga una la cantidad de ciclos que hay , que me refiero con ciclos cuando pasa de un estado 0 pasando por 1 hasta llegar a otro cero, esto se utiliza para una grafica de onda cuadrada.

    Si la versión de SQL Server es 2012, o posterior, he aquí otro enfoque:

    -- código #3
    declare @FH1 datetime, @FH2 datetime;
    SELECT @FH1= min (FechaHora), @FH2= max (FechaHora)
      from #Evento;
    
    with Paso1 as (
    SELECT *,
           lead (Valor) over (order by Extra) as proxValor
      from #Evento
    )
    SELECT @FH1 as [FechaHora inicial], @FH2 as [FechaHora final],
           count(*) as Cantidad
      from Paso1
      where Valor = 0 and proxValor = 1;


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz domingo, 20 de octubre de 2019 17:57
    • Marcado como respuesta Dave2203 lunes, 21 de octubre de 2019 19:28
    domingo, 20 de octubre de 2019 17:55
  • Que tal Jose 

    Efectivamente ya lo probe el inconveniente que veo, que si efectivamente lo hace , pero lo ocupo desglosado

    me sale esto 

    

    pero ya tengo algo 

    la bronca que tengo son ciclos que empiezan en un dia y termina en otro

    ejemplo

    

    La secuencia de esa grafica es la siguiente 

    Utilize el query que puso el compañero Javi Fernandez


    Pregunta


    • Editado Dave2203 domingo, 20 de octubre de 2019 18:20
    domingo, 20 de octubre de 2019 18:19
  • Efectivamente ya lo probe el inconveniente que veo, que si efectivamente lo hace , pero lo ocupo desglosado

    me sale esto 

    En el título y en el enunciado de este tópico se cita "conteo de ciclos" y "como le puedo hacer para contar esos ciclos". Esto es lo que hacen los códigos #2 y #3: cuentan la cantidad de ciclos que han ocurrido.

    Pero si lo que necesita es relacionar los ciclos que ocurrieron, puede simplificar el código #2:

    -- código #4
    declare @UltProxExtra int;
    SELECT @UltProxExtra= (max (Extra) +1) from #Evento;
    
    with 
    Paso1 as (
    SELECT T1.FechaHora, T1.Valor, 
           (SELECT top (1) T2.Extra 
              from #Evento as T2 
              where T2.Extra > T1.Extra
                    and T2.Valor <> T1.Valor
              order by T2.Extra) as proxExtra
      from #Evento as T1
    ),
    Paso2 as (
    SELECT min (FechaHora) as F1, max (FechaHora) as F2, Valor
      from Paso1
      group by coalesce (proxExtra, @UltProxExtra), Valor
    )
    SELECT F1 as [FechaHora inicial], F2 as [FechaHora final]
      from Paso2
      where Valor = 1;


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz lunes, 21 de octubre de 2019 0:01
    domingo, 20 de octubre de 2019 23:28