Ver Mensaje Individual
  #6 (permalink)  
Antiguo 25/06/2012, 09:55
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Crear dos columnas dependiendo de los datos de una

Hola de nuevo jcayon:

Tal como lo describes, así es como funciona la consulta... En realidad el uso del agrupador AVG fue un tanto arbitrario, pero efectivamente, es para que te pusiera la media si es que tuvieras más de una entrada para cada sensor y atributo... si puedes asegurar que SÓLO TIENES UNA ENTRADA PARA CADA SENSOR, ATRIBUTO Y FECHA, en realidad podías utilizar SUM, MIN o MAX sin ningún problema:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->   sensor,
  3.     ->   MIN(IF(atributo = 'Media', valor, NULL)) media,
  4.     ->   MAX(IF(atributo = 'Maxima', valor, NULL)) maxima,
  5.     ->   SUM(IF(atributo = 'Minima', valor, NULL)) minima,
  6.     ->   fechaHora
  7.     -> FROM tabla
  8.     -> GROUP BY sensor, fechaHora;
  9. +--------+-------+--------+--------+---------------------+
  10. | sensor | media | maxima | minima | fechaHora           |
  11. +--------+-------+--------+--------+---------------------+
  12. |      1 |  15.5 |   17.5 |   13.5 | 2012-06-18 17:40:00 |
  13. +--------+-------+--------+--------+---------------------+
  14. 1 row in set (0.00 sec)

Sin embargo es necesario utilizar cualquiera de ellos (el que quieras), ya que de lo contrario sólo se evaluaría uno de los casos:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->   sensor,
  3.     ->   IF(atributo = 'Media', valor, NULL) media,
  4.     ->   IF(atributo = 'Maxima', valor, NULL) maxima,
  5.     ->   IF(atributo = 'Minima', valor, NULL) minima,
  6.     ->   fechaHora
  7.     -> FROM tabla
  8.     -> GROUP BY sensor, fechaHora;
  9. +--------+-------+--------+--------+---------------------+
  10. | sensor | media | maxima | minima | fechaHora           |
  11. +--------+-------+--------+--------+---------------------+
  12. |      1 |  15.5 |   NULL |   NULL | 2012-06-18 17:40:00 |
  13. +--------+-------+--------+--------+---------------------+
  14. 1 row in set (0.00 sec)

En cuanto al rendimiento, revisa que tengas índices creados en tu tabla para mejorar el tiempo de ejecución. La opción que planteabas utilizando INNER JOIN's debería mucho más tardada que la te propongo, pero igual podrías probarla para ver si tiene un mejor rendimiento... sería más o menos así:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->   T1.sensor,
  3.     ->   T1.valor media,
  4.     ->   T2.valor maxima,
  5.     ->   T3.valor minima,
  6.     ->   T1.fechaHora
  7.     -> FROM
  8.     ->   (SELECT * FROM tabla WHERE atributo = 'Media') T1
  9.     -> INNER JOIN
  10.     ->   (SELECT * FROM tabla WHERE atributo = 'Maxima') T2
  11.     ->   ON T1.sensor = T2.sensor AND T1.fechaHora = T2.fechaHora
  12.     -> INNER JOIN
  13.     ->   (SELECT * FROM tabla WHERE atributo = 'Minima') T3
  14.     ->   ON T1.sensor = T3.sensor AND T1.fechaHora = T3.fechaHora;
  15. +--------+-------+--------+--------+---------------------+
  16. | sensor | media | maxima | minima | fechaHora           |
  17. +--------+-------+--------+--------+---------------------+
  18. |      1 |  15.5 |   17.5 |   13.5 | 2012-06-18 17:40:00 |
  19. +--------+-------+--------+--------+---------------------+
  20. 1 row in set (0.00 sec)

Pero te repito, podría apostar mi desayuno a que tendrá peor desempeño que la se agrupaciones condicionales.

Saludos
Leo.