2013-04-25 3 views
2

Я пытаюсь ограничить количество строк в каждом случае только 5 строками. Некоторые случаи имеют только 1 или 2 ряда, но некоторые из них имеют 15 или более.Ограничить количество строк на ID

Это пример хранимой процедуры, которую я использую, чтобы подсчитать количество строк в каждом случае.

SELECT  ROW_NUMBER() OVER(partition by rce.reportruncaseid ORDER BY rce.Reportruncaseid) AS Row, rce.ReportRunCaseId AS CaseId, YEAR(rce.EcoDate) AS EcoYear 
FROM   PhdRpt.ReportCaseList AS rcl INNER JOIN 
        PhdRpt.RptCaseEco AS rce ON rce.ReportId = rcl.ReportId AND rce.ReportRunCaseId = rcl.ReportRunCaseId 
GROUP BY rce.ReportId, rce.ReportRunCaseId, YEAR(rce.EcoDate) 
Order by rce.ReportRunCaseId, YEAR(rce.EcoDate) 

Вот скриншот того, что производит эта хранимая процедура: screenshot

Я пытался использовать где положение, но это не позволит мне поставить функцию окна после того, как, где положение. Он также не распознает мой псевдоним «Строка».

Есть ли другой способ подсчета числа или строк в каждом случае (вместо функции окна), чтобы я мог использовать предложение where? Или существует способ ограничить записи в каждом случае 5, используя существующую хранимую процедуру?

Заранее благодарю вас за помощь.

ответ

1

Вы можете обернуть свою инструкцию в CTE, так как SQL Server поддерживает ее.

WITH records 
AS 
(
    SELECT ROW_NUMBER() OVER(PARTITION BY rce.reportruncaseid 
           ORDER BY rce.Reportruncaseid) AS Row, 
      rce.ReportRunCaseId AS CaseId, 
      YEAR(rce.EcoDate) AS EcoYear 
    FROM PhdRpt.ReportCaseList AS rcl 
       INNER JOIN PhdRpt.RptCaseEco AS rce 
        ON rce.ReportId = rcl.ReportId 
         AND rce.ReportRunCaseId = rcl.ReportRunCaseId 
    GROUP BY rce.ReportId, rce.ReportRunCaseId, YEAR(rce.EcoDate) 
) 
SELECT CaseId, EcoYear 
FROM records 
WHERE row <= 10 
ORDER BY CaseId, EcoYear 
+0

Огромное спасибо. Это прекрасно работает. Если мне нужно было добавить больше столбцов, я бы добавил их в первый оператор select или второй? –

+0

вам нужно добавить их в предложение 'CTE'. Записи внешнего оператора основаны на 'CTE'. –

+0

Отлично. Еще раз спасибо! –

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