none
AVG de datos por fecha en base a clausulas de validación mediante flags RRS feed

  • Pregunta

  • Buenas, tengo una base de datos la cual recibe datos por minuto

    Cada dato va identificado con otra columna flag, si el flag es = 0 este dato es valido, para sacar la media de todos los datos validos por hora lo hago del siguiente modo:

    SELECT DATEPART(HOUR, Fecha) AS HORA, 
       AVG(CASE WHEN FLAG1 =  0 then particulas end) AS PARTICULAS, 
       AVG(CASE WHEN FLAG2 = 0  THEN presion end) AS PRESION,
       AVG(CASE WHEN FLAG3 = 0 THEN presiondif end ) AS PRESDIF,
       AVG(CASE WHEN FLAG4 = 0 THEN temperaturasonda END) AS TEMPSONDA,
       AVG(CASE WHEN FLAG5 = 0 THEN temperatura  END) AS TEMPERATURA,
       AVG(CASE WHEN FLAG6 = 0 THEN caudal  END) AS CAUDAL
    FROM filtro1
    WHERE fecha >= '16-03-2020 16:11:00.370' and fecha <= '18-03-2020 19:20:00.370' 
    GROUP BY DATEPART(Hour, Fecha);

    El problema me viene ahora necesito hacer la media por hora pero solo si el 75% de los datos es válido, es decir si tengo 45 datos con flag = 0 por hora. 

    Esta consulta me lo arroja de uno solo: 

    select DATEPART(HOUR,Fecha) as HORA, avg(particulas) AS MEDIAPARTICULASVALIDA,
    COUNT(flag1 ) AS DATOSVALIDOS from filtro1  where flag1 = 0
    group by datepart(hour,fecha) having count(flag1)>45 

    El problema es que no se como realizarlo para que me haga la media de todos los datos validos y no solo de uno como la primera consulta que he puesto, había intentado algo así sin resultado, no se como realizarlo. 

    SELECT DATEPART(HOUR, Fecha) AS HORA, 
        AVG(CASE WHEN ((SELECT COUNT(*) WHERE FLAG1 = 0)>45) THEN particulas else 
    'DATOS NO VALIDOS' end ) AS PARTICULAS, 
       AVG(CASE WHEN FLAG2 = 0 THEN presion end) AS PRESION,
       AVG(CASE WHEN FLAG3 = 0 THEN presiondif end ) AS PRESDIF,
       AVG(CASE WHEN FLAG4 = 0 THEN temperaturasonda END) AS TEMPSONDA,
       AVG(CASE WHEN FLAG5 = 0 THEN temperatura  END) AS TEMPERATURA,
       AVG(CASE WHEN FLAG6 = 0 THEN caudal  END) AS CAUDAL
    FROM filtro1
    WHERE fecha >= '16-03-2020 16:11:00.370' and fecha <= '18-03-2020 19:20:00.370' 
    GROUP BY DATEPART(Hour, Fecha);

    Gracias.



    • Editado Mourazo martes, 17 de marzo de 2020 15:38
    martes, 17 de marzo de 2020 15:36

Todas las respuestas

  • Hola

     

    Gracias por levantar tu consulta en los foros de MSDN. Estamos analizando su pregunta y vamos a darle seguimiento para buscar la mejor repuesta pertinente al caso.

     

    Gracias por usar los foros de MSDN.

     


    Oscar Navarro

     ____

     

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

     

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

     

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    martes, 17 de marzo de 2020 17:09
    Moderador
  • Encontré la siguiente solución, no se si será la mejor.

    SELECT q.Hora, SUM(q.PARTICULAS) AS PARTICULAS
    FROM (
    SELECT DATEPART(hour, Fecha) as Hora, CONVERT(INT, AVG(particulas)) as PARTICULAS, 0 
    as PRESION, 0 as PRESIONDIF, 0 AS TEMPERATURASONDA, 0 AS TEMPERATURA,
    0 AS CAUDAL
    FROM filtro1
    WHERE flag1 ='0'  GROUP BY DATEPART(hour, Fecha)  having count(flag1)>45
    UNION
    SELECT DATEPART(hour, Fecha) as Hora, 0 AS PARTICULAS, AVG(presion) AS PRESION, 0 as 
    PRESIONDIF, 0 AS TEMPERATURASONDA, 0 AS TEMPERATURA,
    0 AS CAUDAL
    FROM filtro1
    WHERE flag2 ='0'  GROUP BY DATEPART(hour, Fecha) having count(flag2)>45
    ) q
    GROUP BY q.Hora
    ORDER BY q.Hora

    Ahora tengo que salcar las medias en base a los flag = 0 mayores de 45 por minuto diarias y mensuales...

    martes, 17 de marzo de 2020 20:27