我有以下方案:
id | name | price | site_id | agency
1 | NAME | PRICE | 1 | AGENCY1
2 | NAME | PRICE | 1 | AGENCY1
3 | NAME | PRICE | 1 | AGENCY2
4 | NAME | PRICE | 1 | AGENCY2
5 | NAME | PRICE | 2 | AGENCY1
6 | NAME | PRICE | 2 | AGENCY1
7 | NAME | PRICE | 2 | AGENCY1
我想为每个site_id的第一行提供一个唯一的代理商。
例如,上述方案的查询结果应为:
1 | NAME | PRICE | 1 | AGENCY1
3 | NAME | PRICE | 1 | AGENCY2
5 | NAME | PRICE | 2 | AGENCY1
我试图用DISTINCT寻找解决方案,但无法解决。
答案 0 :(得分:3)
在Postgres中,您应该使用distinct on
:
select distinct on (site_id, agency) t.*
from t
order by site_id, agency, id;
这不仅是最简洁的方法,而且通常具有所有方法中最佳的性能。您想要在(site_id, agency, id)
上建立索引以获得最佳性能。
答案 1 :(得分:1)
具有row_number()
窗口功能:
data = null
请参见demo。
结果:
select t.id, t.name, t.price, t.site_id, t.agency
from (
select *, row_number() over (partition by site_id, agency order by id) rn
from tablename
) t
where t.rn = 1