PostgreSQL - 如何在单个查询中获取列的最小值和最大值以及与它们关联的行?

Posted

技术标签:

【中文标题】PostgreSQL - 如何在单个查询中获取列的最小值和最大值以及与它们关联的行?【英文标题】:PostgreSQL - How to get min and max values of a column and the rows associated with them in a single query? 【发布时间】:2021-01-26 18:08:14 【问题描述】:

我有一个名为“产品”的表,其中包含列 - 产品名称、销售价格、销售日期

我想获取 min(sale_price) 和 max(sale_price) 以及最低和最高价格销售发生的日期。

我的查询是这样的:

SELECT sale_price, sale_date FROM product WHERE (sale_price) IN (
            SELECT 
               min(sale_price)
            FROM product
            WHERE product_name = 'PHONE'
            ) AND product_name = 'PHONE'
    UNION
SELECT sale_price, sale_date FROM product WHERE (sale_price) IN (
            SELECT 
               max(sale_price)
            FROM product
            WHERE product_name = 'PHONE'
            ) AND product_name = 'PHONE'

我确信有一种优雅的方式来查询这个。 任何帮助深表感谢。 提前致谢!

【问题讨论】:

请显示样本数据和所需结果。还要详细说明这两个表是什么。 【参考方案1】:

你可以使用窗口函数:

select sale_price, sale_date 
from (
    select p.*, 
        rank() over(order by sale_price) rn_asc,
        rank() over(order by sale_price desc) rn_desc
    from product p
    where product_name = 'PHONE'
) p
where 1 in (rn_asc, rn_desc)

此答案基于您对问题的描述。你没有解释查询中daily_price代表什么表,所以查询不使用它。

如果你想要单行的结果,那么你可以做条件聚合:

select 
    min(sale_price) min_sale_price, min(sale_date) filter(where rn_asc  = 1) min_sale_date,
    max(sale_price) min_sale_price, max(sale_date) filter(where rn_desc = 1) max_sale_date
from (
    select p.*, 
        rank() over(order by sale_price) rn_asc,
        rank() over(order by sale_price desc) rn_desc
    from product p
    where product_name = 'PHONE'
) p
where 1 in (rn_asc, rn_desc)

【讨论】:

我的错...我编辑了描述。有没有办法可以将所有内容放在一行而不是两行?感谢您的快速回复。

以上是关于PostgreSQL - 如何在单个查询中获取列的最小值和最大值以及与它们关联的行?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jOOQ 更新 PostgreSQL 上复合列的单个子字段?

如何使用 PostgreSQL 从表名中获取列属性查询?

PostgreSQL中如何查询索引的元数据

单个查询从具有不同列的多个表中获取记录

用于获取存储在单个表中的 n 级父子关系的 Postgresql 查询

如何使用单个 SQL 查询查找每列的最大值