Usuario
AVG de datos por fecha en base a clausulas de validación mediante flags

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)>45El 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
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.
-
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...