我如何在子查询的特征上使用 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;

请注意,您的查询有两个错误,任何面试都应该失败:

  1. 您正在子查询中使用 ORDER BY。根据标准和大多数数据库,ORDER BY 是不允许或忽略的。
  2. 在您的外部查询中,GROUP BY 列与未聚合的 SELECT 列不一致。这再次违反了标准和大多数数据库 return 语法错误。