2013-04-16 5 views
1

Я написал хранимую процедуру, которая дает мне необработанные данные, требуемые для анализа данных.Получить последние шесть строк из запроса select

Эта ИП, в минуту заполнит временную таблицу со следующей структурой:

CREATE TABLE #Analysis 
(
    AgreementID int, 
    DueDate datetime, 
    DateFrom datetime, 
    DateTo datetime, 
    AmountDue decimal(9,2), 
    AmountPaid decimal(9,2), 
    DueTD decimal(9,2), 
    PaidTD decimal (9,2), 
    ArrearsScore int 
) 

AgreementID можно повторить в этой таблице между 6 записей вверх.

Что мне нужно сделать, это для каждого AgreementID, мне нужно получить последние 6 Рядов

Это будет позволяют мне выполнять остальную часть моего анализа.

Я попытался:

SELECT 
      AN.* 
    FROM 
      #Analysis AS A 
    LEFT OUTER JOIN 
     (SELECT 
      TOP(6) * 
      FROM 
       #Analysis 
      ORDER BY 
       AgreementID, DueDate DESC 
     ) AS AN ON A.AgreementID = AN.AgreementID 
    WHERE AN.AgreementID IS NOT NULL 

Но это не дает мне желаемых результатов.

Может ли кто-нибудь посоветовать?

спасибо.

ответ

2

Если вы используете SQL Server 2005+, вы можете использовать Common Table Expression и Windowing function. ROW_NUMBER() дает ранг или значение для каждого AgreementID, значение которого имеет 1 сортировку из последних DueDate.

WITH records 
AS 
(
    SELECT AgreementID, 
      DueDate, 
      DateFrom, 
      DateToe, 
      AmountDue, 
      AmountPaid, 
      DueTD, 
      PaidTD, 
      ArrearsScore, 
      ROW_NUMBER() OVER(PARTITION BY AgreementID 
         ORDER BY AgreementID, DueDate DESC) rn 
    FROM #Analysis 
) 
SELECT AgreementID, 
     DueDate, 
     DateFrom, 
     DateToe, 
     AmountDue, 
     AmountPaid, 
     DueTD, 
     PaidTD, 
     ArrearsScore 
FROM records 
WHERE rn <= 6 

без использования CTE

SELECT AgreementID, 
     DueDate, 
     DateFrom, 
     DateToe, 
     AmountDue, 
     AmountPaid, 
     DueTD, 
     PaidTD, 
     ArrearsScore 
FROM  
     (
      SELECT AgreementID, 
        DueDate, 
        DateFrom, 
        DateToe, 
        AmountDue, 
        AmountPaid, 
        DueTD, 
        PaidTD, 
        ArrearsScore, 
        ROW_NUMBER() OVER(PARTITION BY AgreementID 
           ORDER BY AgreementID, DueDate DESC) rn 
      FROM #Analysis 
     ) records 
WHERE rn <= 6 
+0

Как добавить WITH заявление на СП, его не то, что я знаком с, и он бросает мне следующую ошибку: Неправильный синтаксис около ключевого слова " с'. Если этот оператор является общим табличным выражением, предложением xmlnamespaces или предложением контекста отслеживания изменений, предыдущий оператор должен быть прерван точкой с запятой. –

+0

Извинения, я правильно прочитал ошибку и потребовал полуточку перед оператором WITH. Спасибо –

+0

вам нужно добавить ';' перед ключевым словом 'WITH'::' –

Смежные вопросы