Espero te sirva...
1. Para evitar realizar n consultas (60 consultas en un rango de una hora) a la tabla super grande, primero se insertan los rangos en una temporal (seria bueno tener los rangos en una fisica para no estarlos calculando cada vez, pero por el momento servirá) y luego se realiza un solo select agrupando por rangos.
2. Se agrega (nolock) a las tablas, porque cuando algun proceso realiza inserts/updates a una tabla, la bloquea (por pagina, tabla, etc dependiendo..) y el select tiene que esperar a que se libere, suponiendo que el bloqueo dura escasos milisegundos, pero considerando la cantidad de registros y la cantidad de consultas, esto incrementa considerablemente el tiempo de respuesta. Con el nolock, el select ignora los bloqueos y permite leer datos no confirmados (de alguna transaccion) y como en este caso se trata de un historico no nos pegará.
3. Me quedó duda con el In para el tipo de sistema (central) como solo tiene un valor lo reemplace por un = (igual).
4. Si el campo fecha_registro es de tipo fecha no se requerirá el cast.
5. Si existen indices en las tablas, la consulta debe ser muy rapida (por fecha, id_senal, etc.. los campos del where y join)
Saludos!
Código:
Declare @fecha_inicial datetime
,@fecha_final datetime
,@f_reso datetime
,@reso int
If Object_id('tempdb..#tblTmpRangosFechas') is not null drop table #tblTmpRangosFechas
Create table #tblTmpRangosFechas (
[fecha_inicial] [datetime] NOT NULL
,[fecha_final] [datetime] NOT NULL
) ON [PRIMARY]
CREATE INDEX [IX_TmpRangosFechas] ON [dbo].[#tblTmpRangosFechas]([fecha_inicial], [fecha_final])
Set @fecha_inicial = '02/05/2007 12:20:00'
Set @fecha_final = '02/05/2007 14:20:00'
Set @reso = 1
Set @Id_Senal = 'A01U1040'
-------------------------------------------------------------------------
-- Obtenemos los rangos de fechas a evaluar.
-------------------------------------------------------------------------
While (@fecha_inicial <= @fecha_final )
Begin
Insert into @tblTmpRangosFechas (fecha_inicial, fecha_final)
Values (@fechainicial, @fecha_final)
Select @fecha_inicial = dateadd(mi,@reso,@fecha_inicial)
End
-------------------------------------------------------------------------
-- Obtenemos el resultado agrupando por rangos de fechas
-------------------------------------------------------------------------
Select a.id_senal
,min(a.fecha_registro) as expr1
,avg(a.valor) as promedio
,r.fecha_inicial as val_max -- Rango inicial
,r.fecha_final as val_min -- Rango final
From #tblTmpRangosFechas r
Inner join
dbo.valores_analogicos a (nolock)
On a.fecha_registro between r.fecha_inicial and r.fecha_final
Inner join
dbo.variables_c01 v (nolock)
On a.Id_Senal = v.Id_Senal And
v.id_senal= @Id_Senal And
a.id_senal = @Id_Senal
Inner join
dbo.tipos_de_sistemas s (nolock)
On v.no_sistema = s.no_sistema
Where s.no_central = '1'
Group by
r.fecha_inicial
,r.fecha_final
,a.Id_Senal
If Object_id('tempdb..#tblTmpRangosFechas') is not null drop table #tblTmpRangosFechas
GO