如何按SQL查询中的最小值进行分组?

时间:2015-10-26 17:01:18

标签: sql postgresql

我遇到了SQL聚合技术的问题。请考虑下表:

Image
-----
id             (auto generated image id)
property_id    (foreign key)
image_url      (text)
image_priority (int)

我想要一个优先级最低的图片网址列表(每个属性一张图片)。换句话说,每个属性最流行的图像(最受欢迎,因为它具有最低优先级)。

property_id | id | url 
----------------------
          1 | 17 | awesome.png
          2 | 23 | best.png

这是我失败的尝试:

SELECT id, property_id, url
FROM image
group by property_id
having priority = min(priority)

2 个答案:

答案 0 :(得分:2)

使用distinct on

select distinct on (property_id) id, property_id, image_url
from image
order by property_id, image_priority;

the documentation

  

SELECT DISTINCT ON(表达式[,...])仅保留第一行   给定表达式求值等于的每组行。 (...)注意每组的“第一行”是   不可预测,除非使用ORDER BY来确保所需的行   首先出现。

答案 1 :(得分:1)

在子选择中,您可以使用ROW_NUMBER()获得一个递增值,该值随每个image_url重新启动并按优先级排序。然后只需选择值为1的那些。

select *
from (
   select I.*, 
          ROW_NUMBER() OVER (PARTITION BY image_url ORDER BY impage_priority ASC) as ord
   from Image as I
) sub
where ord = 1