SQL在一个步骤中按类别提取最大值

时间:2017-12-11 11:14:00

标签: sql sql-server sql-server-2000 greatest-n-per-group

我有一些看起来像这样的数据:

Sector           Category         rec_coun
------           --------         ---------
A                25               53
A                24               1911
A                23               2010
A                ..               ..
A                1                190
B                25               787877
B                24               931231231
B                ..               ..
8                1                778787
..
C                1                6666

我想得到的是一个表格,显示每个部门与该部门和类别组合中的最大记录数相关联的类别,即类似这样的

Sector                Category        Max Recs
------                --------        --------
A                     23              2010
B                     24              931231231
....

在上面的例子中。理想情况下,我想在一个步骤中做到这一点。我试过了

select distinct [Sector], [Category], max(rec_cnt) 
from table
group by [Sector], [Category]
having rec_cnt = max(rec_cnt)

但没有好处。如果可能的话,我宁愿避免嵌套查询中的内部联接,但是为最后保存最好。我实际上在SQL Server 2000上,这可能会使它比它应该更复杂。

3 个答案:

答案 0 :(得分:2)

我相信即使在SQL Server 2000上也可以使用嵌套的GROUP BY

select t.[Sector], table.[Category], t.max_rec
from table 
join
(
  select distinct [Sector], max(rec_cnt) max_rec
  from table 
  group by [Sector]
) t ON table.[Sector] = t.[Sector] and table.rec_cnt = t.max_rec

答案 1 :(得分:0)

使用简单的窗口函数应该可以做到:

select distinct [Sector], 
FIRST_VALUE(Category) over (partition by Sector order by rec_cnt desc) as [Category], 
max(rec_cnt) over (partition by Sector) as [rec_cnt]
from table

编辑:好的,这不起作用,因为窗口函数仅从SQL Server 2005开始引入。请参阅Radim的答案,这应该有效。

答案 2 :(得分:0)

Select Sector, Category, Max(rec_cnt) as 'Max Recs'
From Table
Group By Sector, Category