使用postgresql

时间:2017-05-23 11:53:14

标签: sql postgresql

例如我有这张表

价格

    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 ,价格最高。

1 个答案:

答案 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并且合理。