我们正在尝试编写一个向我们展示的查询:
收入最高和最低的节目并打印他们的账户健康状况
这是我们必须开始的:
置顶
Select TOP 5 * From Health, Revenue
From Program_T, Account_T
Order by Revenue;
底部
Select BOTTOM 5 * From Health, Revenue
From Program_T, Account_T
Order by Revenue;
下面是表格:
Program_T 表:
(AccountName varchar(150) not null unique,
ProgramID int not null,
Revenue int,
Advocates int,
Shares int,
Conversions int,
Impressions int,
LaunchDate date,
CSMID int not null,
constraint Program_PK primary key (AccountName, CSMID),
constraint Program_FK1 foreign key (AccountName) references Account_T(AccountName),
constraint Program_FK2 foreign key (CSMID) references CSM_T(CSMID));
Account_T 表:
create table Account_T
(AccountName varchar(150) not null unique,
Health varchar(10) not null,
EcommercePlatform varchar(50),
CSMID int not null,
Industry varchar(50),
Amount int not null,
constraint Accounts_PK primary key (AccountName),
constraint Accounts_FK foreign key (CSMID) references CSM_T(CSMID));
最佳答案
在 MySQL 中获取 TOP 行的子句是 LIMIT
.您订购升序或降序以获得顶部或底部的行。正如您想要的那样,这意味着您将使用 UNION ALL
粘贴的两个查询结果.由于每个查询都有一个 ORDER BY
子句,您需要括号来向 DBMS 显示 ORDER BY
是什么条款指的是。最后你想要一个 final ORDER BY
子句,因为 UNION ALL
的结果不保证一定会被订购。
select revenue, health
from
(
(
select p.revenue, a.health
from program_t p
join account_t a using (accountname)
order by p.revenue asc limit 5
)
union all
(
select p.revenue, a.health
from program_t p
join account_t a using (accountname)
order by p.revenue desc limit 5
)
) glued
order by revenue;
从 MySQL 8 开始,您还可以使用 ROW_NUMBER
对您的行进行排名,这可能会或可能不会更快:
select revenue, health
from
(
select
p.revenue, a.health,
row_number() over (order by p.revenue asc) as rn1,
row_number() over (order by p.revenue desc) as rn2
from program_t p
join account_t a using (accountname)
) numbered
where rn1 <= 5 or rn2 <= 5
order by revenue;
至于联接,您可以使用 USING
如上所示的子句或使用 ON
:
from program_t p
join account_t a on a.accountname = p.accountname
关于mysql - 尝试编写一个查询来获取最高和最低收入并打印帐户健康状况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55125212/