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 上复合列的单个子字段?