我想找到发行当年北美销量最高的游戏

时间:2021-03-23 23:16:54

标签: sql sql-server

表格

create table genre(
genre_id int primary key,
name varchar(50));

create table game(
game_id int primary key,
name varchar(1000),
genre_id int foreign key references genre(genre_id)); 

create table publisher(
publisher_id int primary key,
name varchar(50));

create table game_publisher(
gpub_id int primary key,
game_id int foreign key references game(game_id),
publisher_id int foreign key references publisher(publisher_id));

create table platform(
platform_id int primary key,
name varchar(50));

create table game_platform(
gplat_id int primary key,
release_year int,
gpub_id int foreign key references game_publisher(gpub_id),
platform_id int foreign key references platform(platform_id));

create table region(
region_id int primary key,
name varchar(50));

create table region_sales(
region_id int foreign key references region(region_id),
gplat_id int foreign key references game_platform(gplat_id),
num_sales decimal(5,2));

**我目前的查询。 它给了我每款游戏的名称、销量和发行年份,但我只想要发行当年北美销量最高的 1 款游戏。**

select gp.release_year, g.name AS game_name, rs.num_sales, r.name AS region_name
from game g inner join game_publisher gpub ON g.game_id = gpub.game_id
inner join game_platform gp ON gpub.gpub_id = gp.gpub_id
inner join region_sales rs ON gp.gplat_id = rs.gplat_id
inner join region r ON rs.region_id = r.region_id
where r.name = 'north America' 
group by gp.release_year, g.name, r.name, rs.num_sales
order by rs.num_sales desc;

1 个答案:

答案 0 :(得分:0)

您的数据模型没有足够的信息来回答这个问题,因为 sales 中没有日期。

如果有一个“年份”列——或者任何日期——你可以在查询中使用它。然后想法是order by并选择一行。

select gp.release_year, g.name AS game_name, rs.num_sales, r.name AS region_name
from game g inner join
     game_publisher gpub
     on g.game_id = gpub.game_id inner join
     game_platform gp 
     on gpub.gpub_id = gp.gpub_id inner join
     region_sales rs 
     on gp.gplat_id = rs.gplat_id inner join
     region r 
     on rs.region_id = r.region_id
where r.name = 'North America' and
      gp.release_year = s.sales_year
order by rs.num_sales desc
fetch first 1 row only;

并非所有数据库都支持标准的 fetch first 子句,因此您可能需要 select toplimit 或其他一些结构。

如果每年有一行区域销售额,则不需要汇总。但是,如果有多行,则需要聚合。