T-SQL Group By Problem

Web*_*mer 6 sql t-sql sql-server group-by aggregate-functions

我有以下问题(或者只是一个思维障碍):

我有一个表(实际上是表中的视图),其中包含以下列和数据:

http://i.stack.imgur.com/n98Sw.png

现在,我想通过"Customer"列对此数据进行分组,并获得具有最高"CompetitorCount"的"CompetitorName".当然我可以创建这样的查询:

SELECT Customer, MAX(CompetitorCount) FROM MyTable GROUP BY Customer

这将返回两行:

Foo; 12  
Bar; 7
Run Code Online (Sandbox Code Playgroud)

但我不能以这种方式获得竞争对手名称.如果我将其包含在分组中,则"客户"将多次显示.否则我必须使用聚合函数来选择我想要使用的"CompetitorName",但当然MAX不起作用.

我确信这可以以某种方式完成,但目前我不知道如何.

在此先感谢您的帮助.

Ric*_*iwi 7

select customer, competitorname, competitorcount
FROM
(
 select *, rn = ROW_NUMBER() over (
  partition by customer order by competitorcount desc)
 from tbl
) X
WHERE rn=1
Run Code Online (Sandbox Code Playgroud)

如果要以最大值显示TIES,请将ROW_NUMBER()更改为RANK().

您甚至可能会cross apply更快地找到该版本,但它不适用于绑定. TOP 1如果竞争对手之间存在联系,则确保单一记录.

select C.*
FROM
(select distinct customer from tbl) A
cross apply
(select top 1 B.*
 from tbl B
 where A.customer = B.customer
 order by B.competitorcount desc) C
Run Code Online (Sandbox Code Playgroud)

它首先选择所有不同的客户.然后,对于每个客户,它会关闭并使用该客户的MAX(竞争对手)检索记录.