Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Trabada en Consulta MySql (https://www.clubdelphi.com/foros/showthread.php?t=43628)

VRO 16-05-2007 14:00:34

Trabada en Consulta MySql
 
Hola , buenos días, estoy trabajando en una consulta de Mysql y me he quedado atascada porque no me salen los resultados exactos que deseo obtener.

Vereis lo que necesito conseguir es: Sacar la última lectura del día anterior al que estamos para todos los contadoresque tengo en mi base de datos.

La consulta que yo he realizado es la siguiente:

Código SQL [-]
SELECT PUERTOS.TAG,CONTADORES.VALOR,CONTADORES.FECHA
FROM CONTADORES,PUERTOS WHERE DISPOSITIVO='Contador' and
CONTADORES.NUMPUERTO=PUERTOS.NUMPUERTO AND 
CONTADORES.IDEQUIPO=PUERTOS.IDEQUIPO AND 
(FECHA>='2007-05-15 00:00:00' AND  FECHA<'2007-05-16 00:00:00')
GROUP BY TAG ORDER BY FECHA DESC

El campo fecha contiene la fecha y la hora.

Lo que me muestra esta consulta son la primera lectura del día anterior al actual para todos los contadores y yo necesitaría sacar la última para cada uno de ellos.

¿Cómo lo podría hacer?.

Gracias por todo.

P.D: Espero haberme expresado con claridad. Hasta pronto

fjcg02 16-05-2007 23:13:09

Si ordenas descendentemente, deberás usar FIRST(), si ordenas ascendentemente, LAST()

Código SQL [-]
SELECT PUERTOS.TAG,LAST(CONTADORES.FECHA), LAST(CONTADORES.VALOR)
FROM CONTADORES,PUERTOS 
WHERE 
DISPOSITIVO='Contador' and
CONTADORES.NUMPUERTO=PUERTOS.NUMPUERTO AND 
CONTADORES.IDEQUIPO=PUERTOS.IDEQUIPO AND 
(FECHA>='2007-05-15 00:00:00' AND  FECHA<'2007-05-16 00:00:00')
GROUP BY TAG 
ORDER BY FECHA
o

Código SQL [-]
SELECT PUERTOS.TAG,FIRST(CONTADORES.FECHA), FIRST(CONTADORES.VALOR)
FROM CONTADORES,PUERTOS 
WHERE 
DISPOSITIVO='Contador' and
CONTADORES.NUMPUERTO=PUERTOS.NUMPUERTO AND 
CONTADORES.IDEQUIPO=PUERTOS.IDEQUIPO AND 
(FECHA>='2007-05-15 00:00:00' AND  FECHA<'2007-05-16 00:00:00')
GROUP BY TAG 
ORDER BY FECHA DESC

Creo que te falta la función de agregado.

También podrías parametrizar la consulta para enviarle una fecha como parámetro y calcular la fecha del día anterior, pero eso depende del motro de BBDD, y yo de MySQL no domino bastante ( ni tengo muchas ganas de mirar, ciertamente ).

Suerte y saludos

VRO 17-05-2007 11:36:07

Trabada con consulta .-. Solución
 
Gracias por responderme , la verdad, es que en Mysql no se puede usar el frist o last ó por lo menos a mi me da error igual es quehe ehcho alguna cagadilla por ahí, pero tu consulta e dio una idea queme llevo a encontrar la solución.

Solución:

Código:


SELECT puertos.tag,contadores.valor,max(fecha)as fecha
FROM CONTADORES,PUERTOS WHERE DISPOSITIVO='Contador'
and CONTADORES.NUMPUERTO=PUERTOS.NUMPUERTO
AND CONTADORES.IDEQUIPO=PUERTOS.IDEQUIPO
AND (FECHA>='2007-05-14 00:00:00' AND  FECHA<'2007-05-15 00:00:00')
GROUP BY TAG 
HAVING max(fecha)< '2007-05-15 00:00:00'
ORDER BY tag asc

Si no hubiese sido por tu respuest no se me hubiese ocurrido.

Probaré a sacar la anterior poniendo las fechas con parámetros .

Muchas gracias y buen día.;)

fjcg02 17-05-2007 12:26:50

Realmente el problema no creo que sea del first ni del last, sino que no incluyes los campos que no tengan función de agrupado en el group by

Código SQL [-]
SELECT PUERTOS.TAG,CONTADORES.VALOR,CONTADORES.FECHA
FROM CONTADORES,PUERTOS WHERE DISPOSITIVO='Contador' and
CONTADORES.NUMPUERTO=PUERTOS.NUMPUERTO AND 
CONTADORES.IDEQUIPO=PUERTOS.IDEQUIPO AND 
(FECHA>='2007-05-15 00:00:00' AND  FECHA<'2007-05-16 00:00:00')
GROUP BY TAG ORDER BY FECHA DESC

Esta era tu consulta inicial. Seguramente te dará error porque haces un group by y no hay funciones de agrupado ( first, last, sum, count, ...). Además, todos los campos que pongas que no tengan función, deberán estar en el group by.

Saludos

VRO 17-05-2007 17:48:00

trabada con consulta en mysql.-. solución
 
Cita:

Empezado por VRO
Gracias por responderme , la verdad, es que en Mysql no se puede usar el frist o last ó por lo menos a mi me da error igual es quehe ehcho alguna cagadilla por ahí, pero tu consulta e dio una idea queme llevo a encontrar la solución.

Solución:

Código:


SELECT puertos.tag,max(contadores.valor),max(fecha)as fecha
FROM CONTADORES,PUERTOS WHERE DISPOSITIVO='Contador'
and CONTADORES.NUMPUERTO=PUERTOS.NUMPUERTO
AND CONTADORES.IDEQUIPO=PUERTOS.IDEQUIPO
AND (FECHA>='2007-05-14 00:00:00' AND  FECHA<'2007-05-15 00:00:00')
GROUP BY TAG 
HAVING max(fecha)< '2007-05-15 00:00:00'
ORDER BY tag asc

Si no hubiese sido por tu respuest no se me hubiese ocurrido.

Probaré a sacar la anterior poniendo las fechas con parámetros .

Muchas gracias y buen día.;)

ahora si que antes se me había olvidado poner max(contadores.valor)

VRO 17-05-2007 20:24:58

Sigo trabada en funcion
 
La verdad es que poniendo max(contadores.valor) ó sin poner el max no me sale el resultado del todo bien , lo que yo pretendo es que me salga el valor correspondiente a la fecha resultante de la consulta , si pongo el max me sale siempre la máxima y no tiene porque corresponder a esa fecha.

Si lo hago como tu dices, poniendo todos los campos que no tiene función en el group by, es decir, en este caso sería el campo valor, me aparecerán todos los valores de ese contador entre las 2 fecha indicadas y no pretendo eso, sino , que me salga sólo un resultado por cada contador, con su valor correspondiente para la última fecha del día anterior.

Me haría falta algo como tu dices el first ó el last, pero cuando lo pongo en la consulta tal que así:

Código:


SELECT puertos.tag,first(contadores.valor),max(fecha)as mfecha
FROM CONTADORES,PUERTOS
WHERE DISPOSITIVO='Contador' and CONTADORES.NUMPUERTO=PUERTOS.NUMPUERTO
AND CONTADORES.IDEQUIPO=PUERTOS.IDEQUIPO
AND (FECHA>='2007-05-13 00:00:00' AND  FECHA<'2007-05-14 00:00:00')
GROUP BY TAG
HAVING max(fecha)< '2007-05-14 00:00:00'
ORDER BY tag asc,FECHA DESC

me dice error 1064 near contadores.valor, si no le pongo no me da error pero no es exacto el resultado que obtengo para todos los casos.

Plissssssss si se te ocurre algo más comantamelo igual es que no te he entendido lo que me intentas explicar, yo seguiré estrujandome el coco.


Gracias por tu apoyo y ayuda...

fjcg02 17-05-2007 23:20:21

En la respuesta nº 2 tienes la solución escrita de dos maneras diferentes.

Saludos
Ah, pero no mezcles el orden . Con DESC, first, sin DESC, last.

VRO 18-05-2007 09:48:02

Gracias
 
Gracias por todo, pero con Mysql no puedo utilizar el first ni el last.

Seguiré investigando


La franja horaria es GMT +2. Ahora son las 23:25:43.

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