【问题标题】:Limit the number of rows per ID限制每个 ID 的行数
【发布时间】:2013-04-25 14:34:24
【问题描述】:

我试图将每个案例的行数限制为 5 行。有些案例只有 1 或 2 行,但有些案例有 15 行或更多。

这是我用来计算每个案例的行数的存储过程示例。

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 子句,但它不允许我在 where 子句之后放置窗口函数。它也无法识别我的“Row”别名。

是否有另一种方法来计算每个案例的数量或行数(而不是窗口函数),以便我可以使用 where 子句?或者有没有办法使用我现有的存储过程将每个案例的记录限制为 5?

提前感谢您的帮助。

【问题讨论】:

    标签: sql sql-server window-functions


    【解决方案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
    

    【讨论】:

    • 非常感谢。这完美地工作。如果我需要添加更多列,我会将它们添加到第一个 select 语句还是第二个?
    • 您需要将它们添加到CTE 子句中。外部语句上的记录,基于CTE
    猜你喜欢
    • 2013-02-25
    • 2017-06-30
    • 2014-03-12
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 2017-11-07
    • 2017-06-26
    相关资源
    最近更新 更多