Postgres-为每个ID选择特定的行

时间:2019-11-30 12:27:23

标签: sql postgresql

我有以下方案:

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寻找解决方案,但无法解决。

2 个答案:

答案 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