SQL Server:从每年的金额中选择前10名
我有一个项目清单,我想按年度列出前10个项目。最好的方法是什么?我正在运行SQL Server 2012 这就是我到目前为止所做的:SQL Server:从每年的金额中选择前10名,sql,sql-server-2012,Sql,Sql Server 2012,我有一个项目清单,我想按年度列出前10个项目。最好的方法是什么?我正在运行SQL Server 2012 这就是我到目前为止所做的: SELECT DISTINCT YEAR(b.DateOfServiceLast) AS 'Year', MONTH(b.DateOfServiceLast) AS 'Month', b.DiagnosisCode, SUM(c.Paid) OVER (PARTITION BY YEAR(b.DateOfServiceLast),
SELECT DISTINCT
YEAR(b.DateOfServiceLast) AS 'Year',
MONTH(b.DateOfServiceLast) AS 'Month',
b.DiagnosisCode,
SUM(c.Paid) OVER (PARTITION BY YEAR(b.DateOfServiceLast), MONTH(b.DateOfServiceLast), (b.DiagnosisCode)) AS 'Cost',
ROW_NUMBER() OVER (PARTITION BY YEAR(b.DateOfServiceLast), MONTH(b.DateOfServiceLast) ORDER BY YEAR(b.DateOfServiceLast), MONTH(b.DateOfServiceLast)) AS 'Row'
FROM
MO_CMTExtract.dbo.ProfessionalClaim a
LEFT JOIN
MO_CMTExtract.dbo.ProfessionalClaimDetail b ON a.ProfessionalClaimID = b.ProfessionalClaimID
LEFT JOIN
MO_CMTExtract.dbo.ProfessionalClaimDetailMoney c ON b.ProfessionalClaimDetailID = c.ProfessionalClaimDetailID
ORDER BY
YEAR(b.DateOfServiceLast),
MONTH(b.DateOfServiceLast),
b.DiagnosisCode,
Row, Cost;
您可以按如下方式使用行号,然后使用行号进行过滤:
WITH cte_base
AS ( SELECT DISTINCT
YEAR(b.DateOfServiceLast) AS 'Year',
MONTH(b.DateOfServiceLast) AS 'Month',
b.DiagnosisCode,
SUM(c.Paid) OVER (PARTITION BY
YEAR(b.DateOfServiceLast),
MONTH(b.DateOfServiceLast),
(b.DiagnosisCode)
) AS 'Cost'
FROM
MO_CMTExtract.dbo.ProfessionalClaim a
LEFT JOIN
MO_CMTExtract.dbo.ProfessionalClaimDetail b
ON a.ProfessionalClaimID = b.ProfessionalClaimID
LEFT JOIN
MO_CMTExtract.dbo.ProfessionalClaimDetailMoney c
ON b.ProfessionalClaimDetailID = c.ProfessionalClaimDetailID),
cte_rownum
AS ( SELECT
cte_base.Year,
cte_base.Month,
cte_base.Cost,
cte_base.Row,
ROW_NUMBER() OVER (PARTITION BY
YEAR(b.DateOfServiceLast)
ORDER BY
cte_base.Cost DESC
) AS 'Rownum'
FROM
cte_base)
SELECT
*
FROM
cte_rownum
WHERE
cte_rownum.Rownum <= 10
ORDER BY
cte_rownum.Year,
cte_rownum.Month,
cte_rownum.Cost DESC;
使用领带是一种方法。我保留了您的查询,但将其包装在CTE中,并通过删除订单。然后,我们用系带来对抗那个CTE
你能提供一些样本数据和期望的结果吗?@marc_你的评论让Jackson 5的abc变得简单,因为123首歌卡在我的脑海里了D
WITH CTE AS(
SELECT DISTINCT
YEAR(b.DateOfServiceLast) AS 'Year',
MONTH(b.DateOfServiceLast) AS 'Month',
b.DiagnosisCode,
SUM(c.Paid) OVER (PARTITION BY
YEAR(b.DateOfServiceLast),
MONTH(b.DateOfServiceLast),
(b.DiagnosisCode)
) AS 'Cost',
ROW_NUMBER() OVER (PARTITION BY
YEAR(b.DateOfServiceLast),
MONTH(b.DateOfServiceLast)
ORDER BY
YEAR(b.DateOfServiceLast),
MONTH(b.DateOfServiceLast)
) AS 'Row'
FROM
MO_CMTExtract.dbo.ProfessionalClaim a
LEFT JOIN
MO_CMTExtract.dbo.ProfessionalClaimDetail b
ON a.ProfessionalClaimID = b.ProfessionalClaimID
LEFT JOIN
MO_CMTExtract.dbo.ProfessionalClaimDetailMoney c
ON b.ProfessionalClaimDetailID = c.ProfessionalClaimDetailID)
SELECT TOP 10 WITH TIES *
FROM CTE
ORDER BY ROW_NUMBER() OVER (PARTITION BY YEAR ORDER BY COST DESC)