Hola de nuevo:
Es probable que la consulta no funcione la primera vez justamente porque no tienes declaradas las variables... y es probable que la consulta no funcione cuando pones los SET, porque en realidad estas ejecutando dos operaciones de base de datos, recuerda que el (;) indica el fin de una sentencia...
Una cosa que puedes hacer es meter esto dentro de un Procedimiento almacenado, de tal manera que puedas colocar tanto los SET's como la consulta y ejecutarlo todo como una sola instrucción... además, recuerda que te comenté que hay muchas formas de hacerlo, en la página que te puse incluso puse otro ejemplo... si no te importa que se cambie el orden de los detalles, puedes utilizar la técnica del COUNT:
Código MySQL:
Ver original+-----------+------------+-------+
| Idfactura | detalle | valor |
+-----------+------------+-------+
| 0001 | Lapiz | 1000 |
| 0001 | Color | 2000 |
| 0001 | Cuaderno | 5000 |
| 0001 | Libro | 10000 |
| 0002 | Color | 2000 |
| 0002 | Sacapuntas | 1000 |
| 0002 | Libro | 10000 |
| 0003 | Libro | 10000 |
+-----------+------------+-------+
mysql
> SELECT a.idfactura
, a.detalle
, a.valor
, COUNT(*) AS row_number
-> ON a.idfactura
= b.idfactura
-> AND (a.detalle
> b.detalle
OR -> (a.detalle
= b.detalle
AND a.valor
>= b.valor
)) -> GROUP BY a.idfactura
, a.detalle
, a.valor
; +-----------+------------+-------+------------+
| idfactura | detalle | valor | row_number |
+-----------+------------+-------+------------+
| 0001 | Color | 2000 | 1 |
| 0001 | Cuaderno | 5000 | 2 |
| 0001 | Lapiz | 1000 | 3 |
| 0001 | Libro | 10000 | 4 |
| 0002 | Color | 2000 | 1 |
| 0002 | Libro | 10000 | 2 |
| 0002 | Sacapuntas | 1000 | 3 |
| 0003 | Libro | 10000 | 1 |
+-----------+------------+-------+------------+
Observa que el único detalle es que para el caso del idfactura = 0001, en lugar asignar Lápiz como número 1, coloca Color... esto es porque está ordenando los detalles de manera alfabética.
Saludos
Leo.