Выберите Топ 5 записей каждого сотрудника в SQL Server - PullRequest
0 голосов
/ 12 ноября 2009

У меня следующая проблема, у меня есть этот запрос, который выбирает последние 5 записей, созданных для сотрудника:

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

Теперь мне нужно построить запрос, чтобы выбрать топ-5 каждого сотрудника в таблице loan_movements, я знаю, что могу сделать это в Oracle, выбрав rownum и rownum <= 5, но мне не удается найти способ сделать это или что-то еще с тем же результатом в SQL Server 2000. </p>

Полагаю, я мог бы использовать функцию, но сначала хочу узнать, можно ли это сделать простым SQL.

Спасибо за помощь ...

Ответы [ 2 ]

2 голосов
/ 12 ноября 2009

Не в SQL 2000, вы не можете сделать это. Однако в SQL 2005/8 вы можете:

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
)
2 голосов
/ 12 ноября 2009

Я ответил, прежде чем заметил, что вы используете SQL Server 2000, поэтому вы не можете воспользоваться ROW_NUMBER . Однако в этой статье MS Knowledgebase приведены примеры искусственного ранжирования строк.

После того, как вы установили ранжирование, используйте запрос во встроенном представлении:

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