Cita:
Iniciado por Sladino el problema es que la consulta es algo más larga de la que he puesto pero el error es el mismo. No sabia si estaba haciendo algo mal.
Hola de nuevo Sladino:
El problema es que lo que quieres hacer no tiene nada que ver con lo que preguntaste en un principio jejeje... pero en fin. Estás equivocando el camino al tratar de utilizar rownum para filtrar tu consulta. Lo que necesitas hacer es numerar tus registros PARA CADA UNO DE TUS EMPLEADOS, ROWNUM sirve para numerar el total de los registros. Para poder numerar los registros agrupando por empleado debes utilizar la función ROW_NUMBER, te dejo alguna lectura didáctica para que aprendas más acerca del concepto.
Sintaxis ROW_NUMBER Para ver la diferencia entre rownum y row_number
Vamos a ver si esto es lo que necesitas:
Supongo que tu tabla Personal tiene más o menos los siguientes datos:
Código:
id|nombre
--------------------
1|uno
2|dos
y tu tabla Puesto tiene más o menos los siguientes datos
Código:
id|personal_id|salario
------------------------------
1|1|500
2|1|200
3|1|300
4|1|100
5|2|600
7|2|100
6|2|500
esto quiere decir que el empleado UNO tiene o ha tenido cuatro empleos y el empleado DOS tres. Para mostrar LOS DOS EMPLEOS MEJOR REMUNERADOS DE CADA UNO DE ELLOS tendrías que hacer algo más o menos como esto:
Código SQL:
Ver originalSELECT nombre, salario FROM
(
SELECT T1.nombre, T2.Salario,
ROW_NUMBER() OVER (PARTITION BY T2.personal_id ORDER BY T2.salario DESC) AS posicion
FROM personal T1 INNER JOIN puesto T2 ON T1.id = T2.personal_id
) T3 WHERE posicion <= 2
Lo que hace esta consulta es "Rankear" los puestos para cada persona de acuerdo a su salario, de tal manera que la consulta interna quedaría más o menos así:
Código:
nombre|salario|posicion
--------------------------------
uno|500|1
uno|300|2
uno|200|3
uno|100|4
dos|600|1
dos|500|2
dos|100|3
si observas la función ROW_NUMBER en su parámetro OVER tiene definido PARTITION BY T2.personal_id lo que le indica que tiene que diferenciar entre cada empleado; la parte de ORDER BY T2.salario indica que es justamente el campo SALARIO el que va a determinar la posición o Rank del registro.
Finalmente lo que haces es filtrar tu información para traer sólo los dos primeros registros. El resultado final de la consulta quedaría entonces así:
Código:
nombre|salario
-----------------------
uno|500
uno|300
dos|600
dos|500
Es decir, los dos puestos mejor pagados para cada uno de los empleados. Dale un vistazo a las ligas que te puse, checa el ejemplo y si continuas con problemas lo comentas en el foro para tratar de ayudarte.
Saludos
Leo.
-------------------------
Si quieres resultados distintos, no hagas siempre lo mismo
Albert Einstein