我在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给了我这个:
但是我想,SQL只打印这个:
我阅读了有关选择中的选择的信息,但我不知道它是如何工作的,我尝试过但它没有用。
答案 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的回答足以回答你的问题。