Ver Mensaje Individual
  #4 (permalink)  
Antiguo 04/02/2011, 14:55
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Error de identificador no válido

Cita:
Iniciado por Sladino Ver Mensaje
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 original
  1. SELECT nombre, salario FROM
  2. (
  3. SELECT T1.nombre, T2.Salario,
  4. ROW_NUMBER() OVER (PARTITION BY T2.personal_id ORDER BY T2.salario DESC) AS posicion
  5. FROM personal T1 INNER JOIN puesto T2 ON T1.id = T2.personal_id
  6. ) 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