SQL:查找从未进球的人数最多的球队的国家/地区名称

时间:2019-04-28 08:31:29

标签: sql postgresql

我有下表:

create table Players (
id integer,
name varchar(50) not null,
birthday date,
memberOf integer not null,
position varchar(20).
primary key (id),
foreign key (memberOf) references Teams(id)
);

create table Goals (
id integer,
scoredIn integer not null,
scoredBy integer not null,
timeScored integer not null,
rating varchar(20),
primary key (id),
foreign key (scoredIn) references Matches(id),
foreign key (scoredBy) references Players(id)
);

create table Teams (
id integer,
country varchar(50) not null,
primary key (id)
);

我在上表中有以下数据:

玩家:

id       |    name     |     birthday     |     memberof    |     position
7           Mina            1997-01-20         1                 Captain
9           John            1997-09-01         1                 Quarterback 
2           Minnie          1995-10-13         3                 Goalkeeper
13          Lisa            1997-03-27         4                 Captain 
12          Rina            1995-01-03         2                 Fullback
11          Jasper          2002-09-22         1                 Halfback
17          Rose            1997-02-11         1                 Goalkeeper
22          Parvin          1993-03-09         3                 Goalkeeper
25          Nasom           1996-12-29         3                 Fullback

目标:

id    |     scoredin    |    scoredby    |    timescored     |     rating
1           10               7                60                   amazing
2           10               7                30                   okay
3           10               7                90                   amazing
4           20               9                119                  nice
5           20               9                80                   amazing
6           20               9                75                   amazing
7           30               2                30                   nice 
8           30               2                90                   amazing
9           40               13               110                  amazing

团队:

id    |    country
1          Australia
2          Malaysia
3          Japan
4          Thailand

我正在尝试输出拥有最多从未进球的球员的球队的国家/地区名称。输出应为:

Country     |     Players 
Australia         2
Japan             2

我有以下观点,该观点给出了从未为每个国家进球的球员人数:

create or replace view zerogoals as
select t.country, count(*)
from (
select distinct p.id, p.name, p.memberof, g.scoredby
from players p
full outer join goals g
on p.id = g.scoredby where scoredby is null
) s
inner join teams t on t.id = s.memberof group by t.country;

上面的查询给了我以下输出:

country    |     count
Australia        2
Japan            2
Malaysia         1

我尝试使用max函数获得所需的输出:

select country, max(count)
from zerogoals
group by country;

但是我得到以下输出:

country    |    max
Australia       2
Japan           2
Malaysia        1

我不确定如何在视图零目标中获取具有最大属性计数值的元组。任何见解都会受到赞赏。

3 个答案:

答案 0 :(得分:0)

您可以尝试在球员,球队和未入球名单之间使用内部联接,按计数并将限制限制为1

select  t.name , count(*)
from player p
INNER JOIN  team t ON t.id = p.memberof
inner join (
select  p.id 
from  PLAYERS p 
where p.id  NOT IN  (
  select scoredby 
  from GOALS
) ) t1 on t1.id  = p.id 
group by t.name 
order by count(*) desc 
limit 1 

如果您想要所有最大值,那么

select  t.name , count(*)
from player p
INNER JOIN  team t ON t.id = p.memberof
inner join (
select  p.id 
from  PLAYERS p 
where p.id  NOT IN  (
  select scoredby 
  from GOALS
) t1 on t1.id  = p.id 
group by t.name 
having  count(*) = (
select  t.name , count(*)
from player p
INNER JOIN  team t ON t.id = p.memberof
inner join (
select  p.id 
from  PLAYERS p 
where p.id  NOT IN  (
  select scoredby 
  from GOALS
) t1 on t1.id  = p.id 
group by t.name 
 order by count(*) 
 limit 1 
)

答案 1 :(得分:0)

您可以使用CTE:

with cte as (
  select
    t.id, t.country, count(*) players 
  from teams t inner join (
    select * from players 
    where id not in (select scoredby from goals)
  ) p on p.memberOf = t.id
  group by t.id, t.country
)
select country, players 
from cte
where players = (select max(players) from cte)
order by country

请参见demo
结果:

country   | players 
Australia |       2
Japan     |       2

答案 2 :(得分:0)

要获取每个国家/地区没有目标的玩家数量,可以使用:

select t.name, count(*) as num_players_no_goal
from team.t join
     player p
     on t.id = p.memberof
where not exists (select 1
                  from goals g
                  where g.scoredby = p.id
                 )
group by t.name;

要将其限制为最大数量,请使用窗口函数:

select name, num_players_no_goal
from (select t.name, count(*) as num_players_no_goal,
             rank() over (order by count(*) desc) as seqnum
      from team.t join
           player p
           on t.id = p.memberof
      where not exists (select 1
                        from goals g
                        where g.scoredby = p.id
                       )
      group by t.name
     ) t
where seqnum = 1;

一个小小的警告是,如果所有团队中的所有球员都进球了,这将不返回任何团队。在这种情况下可以很容易地对其进行修改,但是我想如果那样的话,您宁愿归零团队而不是所有团队。