我遇到了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)
答案 0 :(得分:2)
使用distinct on
:
select distinct on (property_id) id, property_id, image_url
from image
order by property_id, image_priority;
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