Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Como acelerar búsqueda de valores extremos? (https://www.clubdelphi.com/foros/showthread.php?t=61817)

salvica 23-11-2008 17:58:53

Como acelerar búsqueda de valores extremos?
 
Pues eso, lo del encabezamiento

Tengo una tabla con cuatro campos (Clave, Fecha, Hora y Valor) y necesito sacar el máximo, el mínimo y las horas en que se producen de un día determinado.

Hasta ahora lo hago en dos pasos para cada valor (por ejemplo, para el 23-10-2008):
1º - Consulto los valores extremos
Código SQL [-]
SELECT MIN(valor) AS minimo, MAX(valor) AS minimo
  FROM tabla
 WHERE fecha="2008-10-23"
2º - Consulto las fechas en que se producen los valores extremos
Código SQL [-]
SELECT hora
  FROM tabla
 WHERE fecha="2008-10-23"
   AND valor=MINIMO
SELECT hora
  FROM tabla
 WHERE fecha="2008-10-23"
   AND valor=MAXIMO
La cosa funciona, pero da la impresión de quedarse "colgado" el sistema (osea que tarda demasiado), por eso mi pregunta ¿Hay alguna otra forma para acelerar el resultado?

Gracias de antemano
Salvica

coso 23-11-2008 20:18:53

Hola, prueba de no usar las comillas en la comparacion de 'fecha'

RUBICON 23-11-2008 20:42:10

Si son tablas con mucha informacion, una solucion es crear indices y realizar las busquedas implementando los mismos.

salvica 23-11-2008 21:43:34

Cita:

Empezado por coso (Mensaje 327513)
Hola, prueba de no usar las comillas en la comparacion de 'fecha'

Gracias coso, se me olvidó poner en el hilo que utilizo MySql y los ejemplos que he visto vienen así (hasta la fecha no he tenido problemas)

Cita:

Empezado por RUBICON (Mensaje 327516)
Si son tablas con mucha informacion, una solucion es crear indices y realizar las busquedas implementando los mismos.

Hola COSO. Efectivamente, las tablas tienen mucha información.

De todas formas creo que lo he solucionado revisando este hilo, donde poliburro trata algo parecido

Lo dicho, gracias a todos y si no hay más aportaciones doy el hilo por cerrado
Salvica

poliburro 24-11-2008 15:29:56

Código SQL [-]
Select Tabla.* 
  FROM tabla Tabla
  Inner join (
                     SELECT str_to_date("2008-10-23", '%Y-%m-%d') Fecha,
                                    MIN(valor) AS minimo, 
                                    MAX(valor) AS minimo
                        FROM tabla
                     WHERE fecha="2008-10-23"
                 ) Filtro
            On Tabla.Fecha = filtro.Fecha And
                  ( Tabla.Valor = filtro.Máximo Or Tabla.Valor = Filtro.Minimo)

salvica 25-11-2008 05:09:50

Hola poliburro, he intentado adaptar tu consulta y, o no he sabido hacerla :mad:, o el resultado no es el que me esperaba :eek: (saca todo revuelto)

En realidad necesito un consulta que me devuelva el valor máximo (o el mínimo), o mejor los dos :D, con las horas en que se producen dichos eventos (puede ser una o varias, depende de si se repite al cabo del tiempo)

Según el hilo tuyo que puse en el mensaje anterior, hice lo siguiente:
Código SQL [-]
         SQL.Add( 'CREATE OR REPLACE VIEW z_view_extrema AS' );
         SQL.Add( 'SELECT *' );
         SQL.Add( '  FROM z_view_media1min' );
         SQL.Add( ' WHERE (valor=(SELECT MIN(valor) AS minima' );
         SQL.Add( '                       FROM z_view_media1min' );
         SQL.Add( '                  )' );
         SQL.Add( '       )' );
         SQL.Add( ' ORDER BY clave' );
z_view_media1min es una vista en la que ya tengo almacenados los valores de un día determinado (unos 8600 más o menos) y consta (al igual que las tablas padres) de Clave, Fecha, Hora y Valor

La cuestión es que cuando le pido los valores extremos (máximo y mínimo) parece que "se eterniza" (o por lo menos esa es mi impresión), por eso mi pregunta.

De todas formas, muy buenas tus explicaciones en otros hilos.
Gracias
Salvica

poliburro 26-11-2008 18:05:35

Cita:

Empezado por salvica (Mensaje 327807)
Hola poliburro, he intentado adaptar tu consulta y, o no he sabido hacerla :mad:, o el resultado no es el que me esperaba :eek: (saca todo revuelto)

En realidad necesito un consulta que me devuelva el valor máximo (o el mínimo), o mejor los dos :D, con las horas en que se producen dichos eventos (puede ser una o varias, depende de si se repite al cabo del tiempo)



Ok, entonces igual te conviene indexar el campo valor y generar la vista de esta manera:

Código SQL [-]
 
CREATE OR REPLACE VIEW z_view_extrema AS
  SELECT media.*
     FROM z_view_media1min media
      inner join (
                        SELECT MIN(valor) AS minima, Max(valor) Maximo
                       FROM z_view_media1min
                     ) Filtro
                On media.Valor = filtro.Maximo Or 
                      media.Valor = filtro.Minimo 
 ORDER BY clave


de esta manera obtienes todos los registros en media cuyo valor es igual al máximo o igual al mínimo. Indexar el campo valor te ayudará a mejorar la velocidad de la consulta.


Saludos

coso 26-11-2008 20:05:26

hola, no se bien bien si es lo que buscas, pero

Código SQL [-]
select horas from tabla where (valor = (select max(valor) from tabla) or valor = (select min(valor) from tabla)

no te daria el resultado? (quiza lo entendi mal)

coso 26-11-2008 20:07:39

Sobre el rendimiento, no estoy seguro...pero me da la impresion que si pones date como una string, el servidor sql la pasa a datetime...quiza si sacases las comillas :confused: (ya te digo que no estoy seguro, no conozco a fondo MySQL)


La franja horaria es GMT +2. Ahora son las 12:24:08.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi