2009-11-12 8 views
0

J'ai la question suivante, je cette requête sélectionner les 5 derniers documents créés pour un employé:Sélectionnez Top 5 dossiers de chaque employé dans SQL Server

SELECT TOP 5 
     p.value, 
     p.record_date AS FECHA 
FROM 
    employee_loan_movements p 
WHERE 
    p.employee_code = '1' 
    AND p.record_date <= '2009-11-11' 
    AND p.movement_type = 1 
    AND p.value > 0 
ORDER BY p.record_date DESC 

Maintenant je dois construire une requête pour sélectionner le top 5 de chaque employé dans la table loan_movements, je sais que je peux le faire dans Oracle en sélectionnant sélectionner rownum et rownum < = 5 mais je ne peux pas trouver un moyen de le faire ou quelque chose d'autre avec le même résultat dans SQL Server 2000 Je suppose que je pourrais utiliser une fonction mais je veux d'abord savoir si cela peut être fait en langage SQL.

Merci pour l'aide ...

+0

Avez-vous essayé la requête ci-dessus? top 5 est le moyen de limiter le nombre de résultats à 5. – Gavin

+0

@Gavin - Cela donnerait seulement 5 résultats pour tous les employés et non les 5 premiers résultats pour chaque employé – JeffO

Répondre

2

je répondais avant que vous vous rendiez êtes sur SQL Server 2000, on ne pouvait pas profiter de ROW_NUMBER. Cependant, cet article MS Knowledgebase donne des exemples pour classer artificiellement des lignes.

Une fois que vous avez le travail de classement, utilisez la requête dans une vue en ligne:

SELECT x.* 
    FROM (SELECT p.value, 
       ... 'rank' 
      FROM EMPLOYEE_LOAN_MOVEMENTS p) x 
WHERE x.rank <= 5 
2

pas dans SQL 2000, vous ne pouvez pas faire cela. Cependant, dans SQL 2005/8 vous pouvez:

WITH foo(eid) as (select distinct employee_code from employee_loan_movements) 
SELECT * FROM foo 
CROSS APPLY (
    SELECT TOP 5 
     p.value, 
     p.record_date AS FECHA 
    FROM 
    employee_loan_movements p 
    WHERE 
     p.employee_code = foo.employee_code 
     AND p.record_date <= '2009-11-11' 
     AND p.movement_type = 1 
     AND p.value > 0 
     ORDER BY p.record_date DESC 
)