Ver Mensaje Individual
  #7 (permalink)  
Antiguo 24/03/2017, 11:23
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Maximo valor Mysql

Hola miguel20dh:

Hay varias formas de obtener lo que necesitas, una de las que más hemos tratado en este mismo foro es utilizar subconsultas y JOIN's...

En primer lugar, lo que te interesa filtrar es la fecha máxima para cada proyecto para un año en específico, esto lo haces con una consulta simple utilizando MAX y GROUP BY, es decir, hacer algo como esto:

Código MySQL:
Ver original
  1. mysql> SET @anio = 2016;
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> SELECT codigoproyecto, MAX(fecha)
  5.     -> FROM tabla
  6.     -> WHERE YEAR(fecha) = @anio
  7.     -> GROUP BY codigoproyecto;
  8. +----------------+------------+
  9. | codigoproyecto | MAX(fecha) |
  10. +----------------+------------+
  11. |             18 | 2016-09-10 |
  12. +----------------+------------+
  13. 1 row in set (0.00 sec)
  14.  
  15. mysql> SET @anio = 2017;
  16. Query OK, 0 rows affected (0.00 sec)
  17.  
  18. mysql> SELECT codigoproyecto, MAX(fecha)
  19.     -> FROM tabla
  20.     -> WHERE YEAR(fecha) = @anio
  21.     -> GROUP BY codigoproyecto;
  22. +----------------+------------+
  23. | codigoproyecto | MAX(fecha) |
  24. +----------------+------------+
  25. |             18 | 2017-03-01 |
  26. |             19 | 2017-04-09 |
  27. +----------------+------------+
  28. 2 rows in set (0.00 sec)

Observa que la consulta es la misma, lo único que cambia es el valor del parámetro @anio. Ahora, lo que haces es utilizar esto como una subconsulta para filtrar sólo los registros que necesitas, esto lo haces con un INNER JOIN


Código MySQL:
Ver original
  1. mysql> SET @anio = 2016;
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> SELECT T1.* FROM tabla T1
  5.     -> INNER JOIN
  6.     -> ( SELECT codigoproyecto, MAX(fecha) maxfecha
  7.     ->   FROM tabla
  8.     ->   WHERE YEAR(fecha) = @anio
  9.     ->   GROUP BY codigoproyecto) T2 ON T1.codigoproyecto = T2.codigoproyecto
  10.     ->                                  AND T1.fecha = T2.maxfecha;
  11. +---------+----------------+-------------------+------------+
  12. | Estado  | codigoproyecto | vercodigoproyecto | fecha      |
  13. +---------+----------------+-------------------+------------+
  14. | anulado |             18 |                 1 | 2016-09-10 |
  15. +---------+----------------+-------------------+------------+
  16. 1 row in set (0.00 sec)

y funciona también para el año 2017, mostrando dos registros:

Código MySQL:
Ver original
  1. mysql> SET @anio = 2017;
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> SELECT T1.* FROM tabla T1
  5.     -> INNER JOIN
  6.     -> ( SELECT codigoproyecto, MAX(fecha) maxfecha
  7.     ->   FROM tabla
  8.     ->   WHERE YEAR(fecha) = @anio
  9.     ->   GROUP BY codigoproyecto) T2 ON T1.codigoproyecto = T2.codigoproyecto
  10.     ->                                  AND T1.fecha = T2.maxfecha;
  11. +----------+----------------+-------------------+------------+
  12. | Estado   | codigoproyecto | vercodigoproyecto | fecha      |
  13. +----------+----------------+-------------------+------------+
  14. | borrado  |             18 |                 2 | 2017-03-01 |
  15. | aceptado |             19 |                 0 | 2017-04-09 |
  16. +----------+----------------+-------------------+------------+
  17. 2 rows in set (0.00 sec)

Esta consulta sirve SÍ Y SÓLO SI, para cada proyecto hay una única fecha MÁXIMA, es decir, si tienes fechas repetidas el resultado puede no ser el esperado.

Haz la prueba y nos comentas.

Saludos
Leo.