Tsql 在一组中仅排名前10名

Tsql 在一组中仅排名前10名,tsql,group-by,Tsql,Group By,我有以下最终选择声明: SELECT ReportingDate ,PortfolioID ,IssueNme ,ROW_NUMBER() OVER (PARTITION BY PortfolioID ORDER BY SUM(Percentage) DESC) AS [Rank] ,CAST(SUM(Percentage) AS DECIMAL(22,1)) AS [Weight] FROM @Worktabl

我有以下最终选择声明:

SELECT   ReportingDate
         ,PortfolioID
         ,IssueNme
         ,ROW_NUMBER() OVER (PARTITION BY PortfolioID ORDER BY SUM(Percentage) DESC) AS [Rank]
         ,CAST(SUM(Percentage) AS DECIMAL(22,1)) AS [Weight]
FROM     @Worktable as WT
WHERE    WT.IssueType1 IN ('020')
GROUP BY WT.ReportingDate, WT.PortfolioID, WT.IssueNme
ORDER BY [Weight] DESC
然而,我只希望看到每个portfolioID的前10名。我该如何确保为每个分组的PortfolioID获得前10名?

您可以使用CTE。我会用排名代替,但是你可能会得到超过10为每组

WITH CTE AS
(
  SELECT 
      RANK() OVER (PARTITION BY PortfolioID ORDER BY SUM(Percentage) DESC) AS [RANK]
  ,   ReportingDate
  ,   PortfolioID
  ,   IssueNme
  ,   CAST(SUM(Percentage) AS DECIMAL(22,1))  AS [Weight]
  FROM @Worktable as WT
  WHERE WT.IssueType1 IN ('020')
  GROUP BY WT.ReportingDate, WT.PortfolioID, WT.IssueNme
)
SELECT 
  ReportingDate
, PortfolioID
, IssueNme
, [Weight]
FROM CTE
WHERE [RANK] <= 10
ORDER BY [Weight] DESC
你可以使用CTE。我会用排名代替,但是你可能会得到超过10为每组

WITH CTE AS
(
  SELECT 
      RANK() OVER (PARTITION BY PortfolioID ORDER BY SUM(Percentage) DESC) AS [RANK]
  ,   ReportingDate
  ,   PortfolioID
  ,   IssueNme
  ,   CAST(SUM(Percentage) AS DECIMAL(22,1))  AS [Weight]
  FROM @Worktable as WT
  WHERE WT.IssueType1 IN ('020')
  GROUP BY WT.ReportingDate, WT.PortfolioID, WT.IssueNme
)
SELECT 
  ReportingDate
, PortfolioID
, IssueNme
, [Weight]
FROM CTE
WHERE [RANK] <= 10
ORDER BY [Weight] DESC

谢谢你的回复。工作完美,没有考虑使用CTE。感谢您的回复。工作完美,没有考虑使用CTE。