例如我有这张表
价格
price | location
------------+-------------
2.50 | U express
2.19 | Carrefour
如果我要求
SELECT avg(price), min(price), max(price) FROM prices GROUP BY price;
我会得到
avg | min | max
--------+-------+-------
2.34500 | 2.19 | 2.50
是否可以仅使用一个sql语句获得以下结果?
avg | min | max | minLocation | maxLocation
--------+-------+-------+---------------+-------------
2.34500 | 2.19 | 2.50 | Carrefour | U express
minLocation 是价格最低的“location”列中的值。 maxLocation ,价格最高。
答案 0 :(得分:2)
有各种方法。一种方法是使用子查询:
select avg(price), min(price), max(price),
max(case when seqnum_a = 1 then location end) as min_location,
max(case when seqnum_d = 1 then location end) as max_location
from (select p.*, row_number() over (order by price desc) as seqnum_d,
row_number() over (order by price asc) as seqnum_a
from prices p
) p;
这只是一个解决方案。 Postgres提供了数组,丰富的窗口函数以及提供其他解决方案的filter
子句(速度更快)。以上是标准的SQL并且合理。