我如何在子查询的特征上使用 select 语句? (邮政)
How could I use the select statement on feature from a subquery ? (Postgree)
我正在接受面试培训并尝试解决一个问题,我想为每个城市找出花费最多的客户。我得到了城市最大花费的好结果,但是当我试图检索花费这个金额的客户的名字和姓氏时,我得到了一个错误。有没有一种有效的方法来做到这一点?谢谢!
select max(total_payment),X.city, X.firstname, X.lastname
from (
select sum(amount) as total_payment, c.customer_id, cit.city_id, cit.city as city, c.first_name as firstname, c.last_name as lastname
from payment p
inner join customer as c on p.customer_id=c.customer_id
inner join address as ad on c.address_id=ad.address_id
inner join city as cit on ad.city_id=cit.city_id
group by c.customer_id, cit.city_id
order by city
) as X
group by X.city
目标结果列:
每个城市花费最多的客户的名字和姓氏。
120,Paris,Nicolas, Dupont
130、马德里、劳尔、加西亚
70,伦敦,戴夫,戈德曼
您需要 window 个函数:
select cc.*
from (select sum(p.amount) as total_payment, c.customer_id, cit.city_id,
cit.city as city, c.first_name as firstname, c.last_name as lastname,
row_number() over (partition by cit.city order by sum(p.amount) desc) as seqnum
from payment p join
customer c
on p.customer_id = c.customer_id join
address ad
on c.address_id = ad.address_id join
city cit
on ad.city_id = cit.city_id
group by c.customer_id, cit.city_id
) cc
where seqnum = 1;
请注意,您的查询有两个错误,任何面试都应该失败:
- 您正在子查询中使用
ORDER BY
。根据标准和大多数数据库,ORDER BY
是不允许或忽略的。
- 在您的外部查询中,
GROUP BY
列与未聚合的 SELECT
列不一致。这再次违反了标准和大多数数据库 return 语法错误。
我正在接受面试培训并尝试解决一个问题,我想为每个城市找出花费最多的客户。我得到了城市最大花费的好结果,但是当我试图检索花费这个金额的客户的名字和姓氏时,我得到了一个错误。有没有一种有效的方法来做到这一点?谢谢!
select max(total_payment),X.city, X.firstname, X.lastname
from (
select sum(amount) as total_payment, c.customer_id, cit.city_id, cit.city as city, c.first_name as firstname, c.last_name as lastname
from payment p
inner join customer as c on p.customer_id=c.customer_id
inner join address as ad on c.address_id=ad.address_id
inner join city as cit on ad.city_id=cit.city_id
group by c.customer_id, cit.city_id
order by city
) as X
group by X.city
目标结果列: 每个城市花费最多的客户的名字和姓氏。
120,Paris,Nicolas, Dupont
130、马德里、劳尔、加西亚
70,伦敦,戴夫,戈德曼
您需要 window 个函数:
select cc.*
from (select sum(p.amount) as total_payment, c.customer_id, cit.city_id,
cit.city as city, c.first_name as firstname, c.last_name as lastname,
row_number() over (partition by cit.city order by sum(p.amount) desc) as seqnum
from payment p join
customer c
on p.customer_id = c.customer_id join
address ad
on c.address_id = ad.address_id join
city cit
on ad.city_id = cit.city_id
group by c.customer_id, cit.city_id
) cc
where seqnum = 1;
请注意,您的查询有两个错误,任何面试都应该失败:
- 您正在子查询中使用
ORDER BY
。根据标准和大多数数据库,ORDER BY
是不允许或忽略的。 - 在您的外部查询中,
GROUP BY
列与未聚合的SELECT
列不一致。这再次违反了标准和大多数数据库 return 语法错误。