SQL - Contar ceros consecutivos entre fechas/horas

 
Vista:

Contar ceros consecutivos entre fechas/horas

Publicado por Eduardo (6 intervenciones) el 18/04/2007 17:02:27
Hola a todos
Tengo una tabla en access que entrega mediciones por fecha y hora (mediciones cada 30
minutos por 24hrs, sin embargo, existen horas en que no hay medidas (ceros), existe alguna instrucción en SQL que me entregue una tabla que me cuente la cantidad de "ceros consecutivos" y entre que rangos de fechas y horas se encuentran?. La tabla la presento abajo y lo que deseo obtener. Muchisimas gracias por cualquier ayuda.

Tabla Original

Fecha | Hora |Medida
--------------------------
01-04-07 |00:00 |2
01-04-07 |00:30 |3
01-04-07 |01:00 |0
01-04-07 |01:30 |1
01-04-07 |02:00 |0
01-04-07 |02:30 |0
01-04-07 |03:00 |0
01-04-07 |03:30 |2
. . .
. . .
01-04-07 |23:00 |4
01-04-07 |23:30 |0
02-04-07 |00:00 |0
02-04-07 |00:30 |0
02-04-07 |01:00 |0
02-04-07 |01:30 |1
02-04-07 |02:00 |2
02-04-07 |02:30 |6
02-04-07 |03:00 |0
02-04-07 |03:30 |0

Resultado:

FechaIni |FechaFin | HoraIni |HoraFin|Ceros
-----------------------------------
01-04-07 |01-04-07 |01:00 |01:00 |1
01-04-07 |01-04-07 |02:00 |03:00 |3
01-04-07 |02-04-07 |23:30 |01:00 |4
02-04-07 |02-04-07 |03:00 |03:30 |2

Saludos
Eduardo
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
sin imagen de perfil

RE:Contar ceros consecutivos entre fechas/horas

Publicado por Liliana (426 intervenciones) el 19/04/2007 18:18:08
Siguiento tus datos de ejemplo y un código guardado en el rincón de los recuerdos:
(Fijate que hay un valor inexistente en el límite superior)

SELECT Desde = T1.Fecha,
Hasta = MIN (T2.Fecha),
Cantidad = (DATEDIFF ( MI, T1.Fecha, MIN (T2.Fecha)) / 30) + 1
FROM #t T1
LEFT JOIN #t T2
ON T1.Medida = T2.Medida
AND T1.Fecha <= T2.Fecha
WHERE T1.Medida <> ISNULL (( SELECT TOP 1 T3.Medida
FROM #t T3
WHERE T3.Fecha < T1.Fecha
ORDER BY Fecha DESC) ,0)
AND T2.Medida <> ISNULL (( SELECT TOP 1 T4.Medida
FROM #t T4
WHERE T4.Fecha > T2.Fecha
ORDER BY Fecha ), 99999)
AND t1.medida = 0
GROUP BY T1.Fecha, T1.Medida
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

RE:Contar ceros consecutivos entre fechas/horas

Publicado por Eduardo (6 intervenciones) el 19/04/2007 21:19:03
Liliana muchisimas gracias por la respuesta, estoy tratando de hacer funcionar la instrucción, para el caso #t renombre con As la tabla1 pues no me lo reconoce, sin embargo, al ejecutarla me dice que tiene problemas al utilizar un número incorrecto de argumentos, no puede representar T1.Fecha<=T2.Fecha. En todo caso ya es un gran avance para mi que pensaba no se podía realizar este tipo de intrucciones SQL. Nuevamente muchisimas gracias por la ayuda (muy importante para mi), seguire analizando la lógica para encontrar el problema de porque no funciona.
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

RE:Contar ceros consecutivos entre fechas/horas

Publicado por Liliana (426 intervenciones) el 19/04/2007 21:33:42
Eduardo,
Para ayudarte más concretamente, por favor pegá acá el código como quedó y el error exacto que te devuelve el SQL.
Una cosa que omití decirte es que ese código trata fecha y hora juntas, como datos datetime que son los que este motor usa (ms sql server).
Saludos,
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

RE:Contar ceros consecutivos entre fechas/horas

Publicado por Eduardo (6 intervenciones) el 19/04/2007 22:35:32
Liliana te envío el código (no ha sido mucho mi aporte) la tabla1 se llama consumos. Además estoy trabajando en access 2003 asi que estoy usando motor microsoft jet (ojalá no sea un inconveniente):

SELECT Desde=T1.Fecha, Hasta=MIN(T2.Fecha), Cantidad=(DATEDIFF(MI,T1.Fecha,MIN(T2.Fecha))/30)+1
FROM medidas AS T1 LEFT JOIN medidas AS T2 ON (T1.Fecha<=T2.Fecha) AND (T1.Medida=T2.Medida)
WHERE T1.Medida <> ISNULL (( SELECT TOP 1 T3.Medida FROM medidas as T3 WHERE T3.Fecha < T1.Fecha ORDER BY Fecha DESC) ,0) AND T2.Medida <> ISNULL (( SELECT TOP 1 T4.Medida FROM medidas As T4 WHERE T4.Fecha > T2.Fecha ORDER BY Fecha ), 99999) AND t1.Medida = 0
GROUP BY T1.Fecha, T1.Medida;

El error que me arroja es :"Se utilizó un número incorrecto de argumentos con la función en la expresión de consulta 'T1.Medida<>ISNULL((SELECT TOP 1 T3.Medida FROM medidas as T3 WHERE T3.Fecha<T1.Fecha ORDER BY Fecha DESC), 0) AND T2.Medida <> ISNULL ((SELECT TOP 1 T4.Medida FROM medidas As T4 WHERE T4.Fecha>T2.Fecha ORDER BY Fecha),00000) AND T1.Medi'... Cuando intento ver la vista diseño de acces me arroja: "Microsoft Office Access no puede representar la expresión de combinación T1.Fecha.T2.Fecha en Vista diseño.
*Se eliminaron o cambiaron de nombre uno o mas campos
*El nombre de algún campo o tabla especificado en la expresión de combinación está mal escrito.
*La combinación utiliza operador, como > o <, no permitido en la vista Diseño"

Una consulta adicional: el parámetro MI en DATEDIFF indica minutos?

Ufff!!! muchisimas gracias por tu tiempo.
Saludos
Eduardo
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

falto agregar <= RE:Contar ceros

Publicado por Eduardo (6 intervenciones) el 19/04/2007 22:39:36
Liliana te envío el código (no ha sido mucho mi aporte) la tabla1 se llama consumos. Además estoy trabajando en access 2003 asi que estoy usando motor microsoft jet (ojalá no sea un inconveniente):

SELECT Desde=T1.Fecha, Hasta=MIN(T2.Fecha), Cantidad=(DATEDIFF(MI,T1.Fecha,MIN(T2.Fecha))/30)+1
FROM medidas AS T1 LEFT JOIN medidas AS T2 ON (T1.Fecha<=T2.Fecha) AND (T1.Medida=T2.Medida)
WHERE T1.Medida <> ISNULL (( SELECT TOP 1 T3.Medida FROM medidas as T3 WHERE T3.Fecha < T1.Fecha ORDER BY Fecha DESC) ,0) AND T2.Medida <> ISNULL (( SELECT TOP 1 T4.Medida FROM medidas As T4 WHERE T4.Fecha > T2.Fecha ORDER BY Fecha ), 99999) AND t1.Medida = 0
GROUP BY T1.Fecha, T1.Medida;

El error que me arroja es :"Se utilizó un número incorrecto de argumentos con la función en la expresión de consulta 'T1.Medida<>ISNULL((SELECT TOP 1 T3.Medida FROM medidas as T3 WHERE T3.Fecha<T1.Fecha ORDER BY Fecha DESC), 0) AND T2.Medida <> ISNULL ((SELECT TOP 1 T4.Medida FROM medidas As T4 WHERE T4.Fecha>T2.Fecha ORDER BY Fecha),00000) AND T1.Medi'... Cuando intento ver la vista diseño de acces me arroja: "Microsoft Office Access no puede representar la expresión de combinación T1.Fecha.<=T2.Fecha en Vista diseño.
*Se eliminaron o cambiaron de nombre uno o mas campos
*El nombre de algún campo o tabla especificado en la expresión de combinación está mal escrito.
*La combinación utiliza operador, como > o <, no permitido en la vista Diseño"

Una consulta adicional: el parámetro MI en DATEDIFF indica minutos?

Ufff!!! muchisimas gracias por tu tiempo.
Saludos
Eduardo
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

RE:falto agregar <= RE:Contar ceros

Publicado por Liliana (426 intervenciones) el 20/04/2007 13:20:39
Eduardo,
MI en la función DATEDIFF es Minutos, está haciendo la diferencia entre dos fechas, calculada en Minutos.
Lamento no poder ayudarte más ya que el código que te pasé es para MS SQL Server, no para Access, pero entendiendo la idea, supongo que podrás adaptarlo a tus necesidades.
Saludos,
Liliana.
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

RE:Contar ceros

Publicado por eduardo (6 intervenciones) el 30/04/2007 22:41:08
Logre ejecutar la sentencia en SQL para access, pero me entrega esta ordenación para los ceros en la primera tabla:
Desde Hasta Cantidad
01-04-2007 1:00:00 01-04-2007 1:00:00 1
01-04-2007 2:00:00 01-04-2007 2:00:00 1
01-04-2007 2:30:00 01-04-2007 2:30:00 1
01-04-2007 3:00:00 01-04-2007 3:00:00 1
01-04-2007 23:30:00 01-04-2007 23:30:00 1
02-04-2007 02-04-2007 1
02-04-2007 0:30:00 02-04-2007 0:30:00 1
02-04-2007 1:00:00 02-04-2007 1:00:00 1
02-04-2007 3:00:00 02-04-2007 3:00:00 1
02-04-2007 3:30:00 02-04-2007 3:30:00 1

Se podrà ordenar nuevamente con un SQL y obtener:
"Desde" ,"Hasta" ,"Cantidad de ceros"
1/4/2007 01:00:00 ,1/4/2007 01:00:00 , 1.00
1/4/2007 02:00:00 ,1/4/2007 03:00:00 ,3.00
1/4/2007 23:30:00 ,2/4/2007 01:00:00 ,4.00
2/4/2007 03:00:00 ,2/4/2007 03:30:00 ,2.00

Muchas gracias si alguien puede saber como hacerlo
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