Hola gjx2:
Tienes muchas formas de resolver tu consulta, algunas más complejas que otras, aquí te pongo otro ejemplo que puede resultarte más simple.
Lo que quieres hacer sería el equivalente a obtener la función ROW_NUM de tus datos, si tienes dudas investiga un poco a qué se refiere, lamentablemente MySQL no tiene esta función, aunque hay algunas formas de implementarla. Supongamos tus datos de ejemplo:
Código MySQL:
Ver original+------------+-------+---------+
| fecha | elem | costo |
+------------+-------+---------+
| 2017-01-02 | jose | 32.33 |
| 2017-01-03 | jose | 11.63 |
| 2017-01-04 | jose | 484.23 |
| 2017-01-05 | jose | 292.43 |
| 2017-01-01 | pedro | 532.53 |
| 2017-01-03 | pedro | 2332.00 |
| 2017-01-04 | pedro | 352.13 |
| 2017-01-01 | juan | 6732.00 |
| 2017-01-03 | juan | 422.63 |
| 2017-01-05 | juan | 552.43 |
+------------+-------+---------+
10 rows
in set (0.00 sec
)
la función ROW_NUM lo que hace es "numerar" cada registro para asignarle una posición o "rank", una forma de hacerlo es con una subconsulta y con la función COUNT, así:
Código MySQL:
Ver originalmysql
> SELECT T1.fecha
, T1.elem
, T1.costo
, COUNT(*) AS row_number
-> AND T1.fecha
<= T2.fecha
+------------+-------+---------+------------+
| fecha | elem | costo | row_number |
+------------+-------+---------+------------+
| 2017-01-05 | jose | 292.43 | 1 |
| 2017-01-04 | jose | 484.23 | 2 |
| 2017-01-03 | jose | 11.63 | 3 |
| 2017-01-02 | jose | 32.33 | 4 |
| 2017-01-05 | juan | 552.43 | 1 |
| 2017-01-03 | juan | 422.63 | 2 |
| 2017-01-01 | juan | 6732.00 | 3 |
| 2017-01-04 | pedro | 352.13 | 1 |
| 2017-01-03 | pedro | 2332.00 | 2 |
| 2017-01-01 | pedro | 532.53 | 3 |
+------------+-------+---------+------------+
10 rows
in set (0.00 sec
)
Lo que se hace es ordenar las por elem y FECHAS, y contar el número de elementos que hay antes que una fecha en específico, en lo particular a ti te interesa encontrar sólo los dos últimos registros, entonces utilizas la cláusula HAVING para filtrar solo los que te interesan;
Código MySQL:
Ver originalmysql
> SELECT T1.fecha
, T1.elem
, T1.costo
, COUNT(*) AS row_number
-> AND T1.fecha
<= T2.fecha
+------------+-------+---------+------------+
| fecha | elem | costo | row_number |
+------------+-------+---------+------------+
| 2017-01-05 | jose | 292.43 | 1 |
| 2017-01-04 | jose | 484.23 | 2 |
| 2017-01-05 | juan | 552.43 | 1 |
| 2017-01-03 | juan | 422.63 | 2 |
| 2017-01-04 | pedro | 352.13 | 1 |
| 2017-01-03 | pedro | 2332.00 | 2 |
+------------+-------+---------+------------+
Ahora, esto puedes meterlo en una subconsulta y utilizar las funciones de agrupación MIN, MAX y SUM para obtener el resultado que necesitas:
Código MySQL:
Ver original -> AND T1.fecha
<= T2.fecha
+------------+------------+-------+---------+
| fecha1 | fecha2 | elem | total |
+------------+------------+-------+---------+
| 2017-01-04 | 2017-01-05 | jose | 776.66 |
| 2017-01-03 | 2017-01-05 | juan | 975.06 |
| 2017-01-03 | 2017-01-04 | pedro | 2684.13 |
+------------+------------+-------+---------+
Es muy importante hacerte notar que esta consulta SÓLO FUNCIONA SI NO TIENES FECHAS REPETIDAS EN TU TABLA PARA UN MISMO ELEMENTO, si fuera el caso, entonces esta técnica no funciona.
Te recomiendo que le des un vistazo a esta página:
http://www.artfulsoftware.com/infotr...ip.php?id=1098 http://www.artfulsoftware.com/infotree/queries.php
Ahí vienen muchas consultas de alto nivel que te pueden servir.
Saludos
Leo.