从每个子集中选择Max

时间:2011-11-15 01:57:08

标签: sql-server max subset

我在这里敲我的头。我觉得很愚蠢,因为我确定我以前做过这样的事情,但不能为我的生活记住如何。其中一天我猜>。<

说我有以下数据:--->和一个返回此的查询:--->但我想要这个:

ID   FirstID              ID   FirstID                ID   FirstID
--   -------              --   -------                --   -------
1     1                   1    1                      7    1
2     1                   3    3                      3    3
3     3                   4    4                      6    4
4     4                   5    5                      5    5
5     5
6     4
7     1

请注意,我的查询返回ID = FirstID的记录,但我希望它返回唯一FirstID的每个子集的Max(ID)。听起来很简单吧?这就是我的想法,但我一直在追回记录#7。这是我的查询(返回上面第二块图的那个)和一些测试代码,让您的生活更轻松。我需要这个给我最右边的块结果。应该注意,这是一个自连接表,其中FirstID是ID的外键。谢谢:))

declare @MyTable table (ID int, FirstID int)
insert into @MyTable values (1,1),(2,1),(3,3),(4,4),(5,5),(6,4),(7,1)
select ID, FirstID
from @MyTable
where ID = FirstID

2 个答案:

答案 0 :(得分:4)

这是否有效

declare @MyTable table (ID int, FirstID int)
insert into @MyTable values (1,1),(2,1),(3,3),(4,4),(5,5),(6,4),(7,1)

Select FirstID, Max (Id) ID
From @MyTable
Group BY FirstID

结果

FirstID     ID
----------- -----------
1           7
3           3
4           6
5           5

答案 1 :(得分:1)

使用SQL2005及更高版本的SQL2008版本,SQL Server中的聚合函数已得到改进

您可以使用PARTITION BY子句,例如MAX,MIN,SUM,COUNT函数

请尝试以下示例

select 
Distinct FirstID, Max(ID) OVER (PARTITION BY FirstID) MaxID
from @MyTable 

您可以在http://www.kodyaz.com/t-sql/sql-count-function-with-partition-by-clause.aspx

找到示例

根据您的评论,我修改了相同的查询,只是为了按行和列的顺序提供确切的输出,如下所示

select Distinct 
    Max(ID) OVER (PARTITION BY FirstID) ID,
    FirstID
from @MyTable 
order by FirstID