Sql server 在列最高的位置获取不同的记录
我有一个列表,我想得到每个不同(月)列的最高金额。有没有一种简单的方法可以捕获SQL Server中的记录 原始表格 预期结果 我尝试的以下查询显示了所有记录Sql server 在列最高的位置获取不同的记录,sql-server,Sql Server,我有一个列表,我想得到每个不同(月)列的最高金额。有没有一种简单的方法可以捕获SQL Server中的记录 原始表格 预期结果 我尝试的以下查询显示了所有记录 SELECT [MAX_T].[ID], [MAX_T].[ProjID], [MAX_T].[Month], [MAX_T].[MaxSpent] FROM @Table1 [T] INNER JOIN (SELECT [ID], [ProjID], [Month], MAX([Spent
SELECT
[MAX_T].[ID],
[MAX_T].[ProjID],
[MAX_T].[Month],
[MAX_T].[MaxSpent]
FROM
@Table1 [T] INNER JOIN
(SELECT [ID], [ProjID], [Month], MAX([Spent]) AS [MaxSpent]
FROM @Table1
GROUP BY [ID], [ProjID], [Month]) AS [MAX_T]
ON [T].[ProjID] = [MAX_T].[ProjID] AND
[T].[Month] = [MAX_T].[Month] AND
[T].[Spent] = [MAX_T].[MaxSpent]
使用
行号
:
;WITH CTE AS
(
SELECT *,
RN = ROW_NUMBER() OVER(PARTITION BY ID ORDER BY Spent DESC)
FROM dbo.YourTable
)
SELECT ID,
ProjID,
[Month],
Spent
FROM CTE
WHERE RN = 1;
另一种方法是考虑集合中的数据:
首先获得每月最高美元的集合,然后将该集合加入到基本集合以获取附加数据SELECT A.*
FROM @TABLE A
INNER JOIN (
SELECT Month, Max(Spent) as MSpent
FROM @Table1
GROUP BY Month) B
on B.Month = A.Month, B.MSpent = A.Spent
我就是这样做的:
select ID, ProjID, Month, Spent, RowNo
from (
select ID, ProjID, Month, Spent,
ROW_NUMBER ()
over (
PARTITION BY Month
order by Spent DESC
) as RowNo
from (
select ID, ProjID, Month, Spent
from Table1
)
where RowNo = 1
)
这是未经测试的代码-我刚刚用您的字段名替换了我的字段名 可以让查询选择前4条记录吗?例如:@Ropeh,你的意思是什么?这个查询应该适用于SQL Server 2005+这应该是正确的,但我认为你希望按月份而不是ID进行分区。@laylarenee是的,你是对的,只是示例数据显示每月一个ID值too@Ropeh什么是“前4个”是什么意思?谢谢你的解决方案xQbert。使用Lamaks实现了它。谢谢你的帮助。
SELECT A.*
FROM @TABLE A
INNER JOIN (
SELECT Month, Max(Spent) as MSpent
FROM @Table1
GROUP BY Month) B
on B.Month = A.Month, B.MSpent = A.Spent
select ID, ProjID, Month, Spent, RowNo
from (
select ID, ProjID, Month, Spent,
ROW_NUMBER ()
over (
PARTITION BY Month
order by Spent DESC
) as RowNo
from (
select ID, ProjID, Month, Spent
from Table1
)
where RowNo = 1
)