Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-11-2008
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
Unhappy Consulta complicada (por lo menos para mi)

Hola a tod@s

Tengo una tabla declarada como:
Código SQL [-]
- =======
- clave es la fecha y hora del registro en formato YYYYMMDDHHnnSS
- fecha es la fecha del registro (año, mes y día)
- hora  es la hora del registro  (horas, minutos y segundos)
- =======
   CREATE TABLE IF NOT EXISTS temporal (
          clave    char(14) collate latin1_spanish_ci NOT NULL,
          fecha    date     NOT NULL,
          hora     time     NOT NULL,
          valor    float    NOT NULL,
          PRIMARY KEY  (clave)
   ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci;
Bien, lo que pretendo es sacar la media de los DIEZ minutos previos a una hora del día, teniendo en cuenta que;
- las 00 horas comprenden de las 23:50:00 del día anterior a las 00:00:00 del día actual
- las XX horas comprenden de las (XX-1):50:00 a las XX:00:00 de la hora

¿podeis decirme como puedo hacerlo de "una tacada"?
hasta ahora lo máximo a lo que llego es a hacer dos o tres consultas para sacar valores intermedios

Gracias adelantadas
Salvica

Nota: Delphi-7, Zeos y MySql-5
Responder Con Cita
  #2  
Antiguo 09-11-2008
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
Angry Se me olvidaba

Se me olvidaba añadir que previamente hice esto (para sacar los datos cada DIEZ segundos), pero no sé como sacar las medias ya que si agrupo me mezcla las horas (hacerlo ya se que es con AVG)
Código SQL [-]
SELECT tactual.fecha, tactual.hora, tactual.valor
  FROM tseca AS tactual
 WHERE (tactual.fecha="2008-10-12" AND DATE_FORMAT(hora, "%H:%i")>"23:50")
    OR (tactual.fecha="2008-10-13" AND DATE_FORMAT(hora, "%i:%s")="00:00")
    OR (tactual.fecha="2008-10-13" AND DATE_FORMAT(hora, "%i")>"50" AND DATE_FORMAT(hora, "%i")<="59")
    OR (tactual.fecha="2008-10-14" AND DATE_FORMAT(hora, "%H:%i:%s")="00:00:00")
-- GROUP BY DATE_FORMAT(hora, "%H:%i")
 ORDER BY clave ASC
Saludos y repito, gracias adelantadas
Salvica
Responder Con Cita
  #3  
Antiguo 10-11-2008
Avatar de gmontes
gmontes gmontes is offline
Miembro
 
Registrado: jul 2004
Ubicación: Culiacán, Sinaloa, México
Posts: 668
Poder: 20
gmontes Va por buen camino
ok, se supone que fecha es el dia a buscar

hora es por ejemplo las 14:00:00 y

hora2 seria = (hora - (10/1440)) , que nos da la hora elegida menos 10 minutos.

restar 20/1440 ala hora x seria restarle 20 minutos



Código SQL [-]
select avg(valor) from tseca  where fecha = :fecha and (hora <= :hora and hora >= :hora2 )


__________________
Todos llevamos nuestros demonios a cuestas..
Responder Con Cita
  #4  
Antiguo 14-11-2008
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
hola gmontes, gracias por responder.
Perdona la demora pero no he podido entrar antes, motivos de trabajo

La consulta no me sirve, ya que tendría que meterme en un bucle para leer los datos de cada día y los de la última hora del día anterior (25 entradas/salidas diarias)

Lo solucioné con una vista (error mio, pensaba que mysql-5 no las soportaba ) en la que con un case pongo todos los datos en el mismo minuto y al final los agrupo por ese campo
Código SQL [-]
CREATE OR REPLACE VIEW z_view_tmedia10min AS
SELECT clave, fecha, hora, 
       DATE_FORMAT(hora, "%H") as sHora,
      (CASE WHEN MINUTE(hora) BETWEEN  0 AND  9 then  0
            WHEN MINUTE(hora) BETWEEN 10 AND 19 then 10
            WHEN MINUTE(hora) BETWEEN 20 AND 29 then 20
            WHEN MINUTE(hora) BETWEEN 30 AND 39 then 30
            WHEN MINUTE(hora) BETWEEN 40 AND 49 then 40
                                                else 50
       END) AS iMinuto,
       ROUND(AVG(valor), 1) AS tmedia10min
  FROM tseca
 WHERE (fecha="2008-10-29" AND HOUR(hora)=23)
    OR (fecha="2008-10-30")
    OR (fecha="2008-10-31" AND HOUR(hora)= 0)
 GROUP BY fecha, sHora, iMinuto
 ORDER BY clave;
De esta forma me vale para sacar los 10 minutoas anteriores (iMinuto=50) y los de los 10 minutos siguientes (iMinuto=0)

Saludos
Salvica
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Consulta complicada superhopi MS SQL Server 15 03-07-2006 23:53:59
Consulta complicada Luciano M. SQL 6 01-12-2005 19:30:15
Consulta para experimentados COMPLICADA!! marceloalegre SQL 0 27-07-2005 01:06:03
Consulta Complicada NickName SQL 6 29-04-2004 07:33:31
Complicada consulta mosorio SQL 3 12-08-2003 20:12:00


La franja horaria es GMT +2. Ahora son las 08:42:46.


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
Copyright 1996-2007 Club Delphi