如何在子查询中使用 select 语句? (Postgres)

Posted

技术标签:

【中文标题】如何在子查询中使用 select 语句? (Postgres)【英文标题】:How could I use the select statement on feature from a subquery ? (Postgree) 【发布时间】:2021-06-19 22:13:21 【问题描述】:

我正在接受面试培训并试图解决一个问题,我想为每个城市找出花费最多的客户。我得到了按城市花费的最大金额的好结果,但是当我尝试检索花费此金额的客户的姓名和姓氏时出现错误。有没有一种有效的方法来做到这一点?谢谢!

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,巴黎,尼古拉斯,杜邦

130,马德里,劳尔,加西亚

70,伦敦,戴夫,高盛

【问题讨论】:

为什么选择 max(total_payment),X.city, X.firstname, X.lastname,但是 GROUP BY 只能按 X.city 你好,因为我只需要按城市花费最多的人 好的。但是你只需要选择 max(total_payment),X.city from(...)group by X.city 我也想要花最多的人的名字 如果你有两个?如果您提供一些示例数据和所需的输出会更好,因为现在看起来您需要一些窗口计算 【参考方案1】:

你想要窗口函数:

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 列不一致。再一次,这违反了标准,并且大多数数据库都会返回语法错误。

【讨论】:

我还有很多东西要学,非常感谢! @robin_data 。 . .如果这回答了您的问题,您可以接受答案。 当然我刚刚做了。

以上是关于如何在子查询中使用 select 语句? (Postgres)的主要内容,如果未能解决你的问题,请参考以下文章

如何在子查询中使用 select 中的值?

PB数据窗口中SQL语句动态LIKE后边加参数如何加?

在子查询的FROM中使用Postgres窗口语句

在子查询之间的 ORACLE 连接语句中选择顶部记录

带有在子查询中生成的值的 Oracle SQL 更新语句

mysql不支持在子查询中使用limit解决办法