Sql最大奖杯数

时间:2018-02-20 15:22:39

标签: sql sql-server max rows

我在SQL中创建关于篮球的数据库。老师给我这个任务,我需要从我的数据库中打出篮球运动员的最大奖杯数。所以,我写了一些代码:

select surname ,count(player_id) as trophy_count

from dbo.Players p 
left join Trophies t  on player_id=p.id

group by p.surname

和SQL给了我这个:

BBallPlayers

但是我想,SQL只打印这个:

LonzoBallPrintOut

我阅读了有关选择中的选择的信息,但我不知道它是如何工作的,我尝试过但它没有用。

3 个答案:

答案 0 :(得分:2)

使用TOP

SELECT TOP 1 surname, COUNT(player_id) AS trophy_count      -- or TOP 1 WITH TIES
FROM dbo.Players p 
LEFT JOIN Trophies t
    ON t.player_id = p.id
GROUP BY p.surname
ORDER BY COUNT(player_id) DESC;

如果您想获得最高分数的所有关系,请使用SELECT TOP 1 WITH TIES

答案 1 :(得分:0)

;WITH CTE AS
(
    select surname ,count(player_id) as trophy_count
    from dbo.Players p 
    group by p.surname;
)
select * 
from CTE
where trophy_count = (select max(trophy_count) from CTE)

虽然选择带有领带的顶部有效(并且可能更有效)但我会说这段代码在现实世界中可能更有用,因为它可以用来找到最大,最小或特定的奖杯数量,如果需要的话非常简单修改代码。

这基本上是先让你的小组,然后让你指定你想要的结果。在这种情况下,您可以使用

max(trophy_count) - get the maximum 
min(trophy_count) - get the minimum
# i.e. - where trophy_count = 3 - to get a specific trophy count
avg(trophy_count) - get the average trophy_count

还有很多其他人。 Google“SQL聚合函数”

答案 2 :(得分:0)

你最终会走下需要分段的兔子洞(例子是按周或按联赛)。那么你将要使用带有cte或子查询的windows函数

对于你的例子:

;with cte_base as 
(
-- Set your detail here (this step is only needed if you are looking at aggregates)
select surname,Count(*) Ct
left join Trophies t  on player_id=p.id
group by p.surname

, cte_ranked as
-- Dense_rank is chosen because of ties
-- Add to the partition to break out your detail like by league, surname
(
select *
    , dr = DENSE_RANK() over (partition by surname order by Ct desc)
from cte_base
)

select *
from cte_ranked
where dr = 1 -- Bring back only the #1 of each partition

这实在是太过分了,但帮助你奠定了处理更复杂查询的基础。 Tim Biegeleisen的回答足以回答你的问题。