Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在列最高的位置获取不同的记录_Sql Server - Fatal编程技术网

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

我有一个列表,我想得到每个不同(月)列的最高金额。有没有一种简单的方法可以捕获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]) 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
)